我正在使用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 );
它可以工作,但是代码看起来很愚蠢,整个情况对我来说毫无意义。有人知道为什么会发生这种情况吗?如果是,那么还有其他解决方法吗?
答案 0 :(得分:1)
出现异常行为的原因是set_column()
不能像集合那样处理范围。例如,如果您为A:F
设置了一个列范围,然后为C:D
设置了一个列范围,那么您不会自动设置3个范围(A:B
,C:D
,E:F
)。因此,您需要手动进行拆分。
对于您而言,最好使用set_column()
的数字范围,例如:
$worksheet->set_column( 8, 8, 40 );
# Instead of:
$worksheet->set_column( 'I:I', 40 );
我建议设置一个数组(或散列)的初始数组,该数组将使用每列的列宽,然后覆盖要隐藏的列宽,最后遍历数组并调用{{1} }。