列只能隐藏在它们创建的组中

Columns can be hidden only in groups they were created

我正在研究使用 Perl 将一些数据导出到 xlsx 文件的自动化,尤其是模块 Excel::Writer::XLSX。如果一些已经创建的列是空的或不相关的,我希望它们被隐藏。虽然在某些情况下,使用通用命令可以轻松完成:

$worksheet->set_column( 'I:J', undef, undef, 1);

在某些特定情况下,它们不会像预期的那样消失。经过多次尝试,原来可以通过改变他们原来的设置方式来解决问题。

例如,如果我这样创建它们:

$worksheet->set_column( 'I:I', 40 );
$worksheet->set_column( 'J:M', 60 );
$worksheet->set_column( 'N:N', 40 );

然后命令

$worksheet->set_column( 'K:N', undef, undef, 1);

只会隐藏列 'N'。

解决方案是像那样创建它们

$worksheet->set_column( 'J:J', 60 );
$worksheet->set_column( 'K:M', 60 );
$worksheet->set_column( 'N:N', 40 );

所以它有效,但代码看起来很愚蠢,整个情况对我来说毫无意义。有谁知道为什么会这样,如果是的话,还有其他解决办法吗?

奇怪行为的原因是 set_column() 不像集合那样处理范围。例如,如果您为 A:F 设置一个列范围,然后为 C:D 设置另一个列范围,那么您不会自动设置 3 个范围(A:BC:DE:F ).所以你需要手动进行拆分。

在您的情况下,最好使用 set_column() 的数字范围,例如:

$worksheet->set_column( 8, 8, 40 );

# Instead of:
$worksheet->set_column( 'I:I', 40 );

我建议设置一个初始的数组(或散列)数组,其中包含您将用于每一列的列宽,然后覆盖您想要隐藏的那些,最后遍历数组并调用 set_column() 每列。