列只能在创建的组中隐藏

时间:2019-04-11 11:27:48

标签: perl excel-writer-xlsx

我正在使用Perl(特别是使用模块Excel :: Writer :: XLSX)将某些数据导出到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 );

它可以工作,但是代码看起来很愚蠢,整个情况对我来说毫无意义。有人知道为什么会发生这种情况吗?如果是,那么还有其他解决方法吗?

1 个答案:

答案 0 :(得分:1)

出现异常行为的原因是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 );

我建议设置一个数组(或散列)的初始数组,该数组将使用每列的列宽,然后覆盖要隐藏的列宽,最后遍历数组并调用{{1} }。