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

Perl 列只能在创建它们的组中隐藏,perl,excel-writer-xlsx,Perl,Excel Writer Xlsx,我正在使用Perl将一些数据自动导出到xlsx文件,特别是使用模块Excel::Writer::xlsx。如果一些已经创建的列是空的或不相关的,我希望它们被隐藏。在某些情况下,使用通用命令可以轻松完成: $worksheet->set_column( 'I:J', undef, undef, 1); 在某些特殊情况下,它们不会像预期的那样消失。经过多次尝试,结果证明,通过改变最初设置的方式可以解决问题 例如,如果我这样创建它们: $worksheet->set_column( 'I

我正在使用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\u column()
不能像set那样处理范围。例如,如果为
a:F
设置一个列范围,然后为
C:D
设置另一个列范围,则不会自动设置3个范围(
a:B
C:D
E:F
)。因此,您需要手动进行拆分

在您的情况下,最好使用数值范围来设置列()如下:

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

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

我建议设置一个数组(或散列)的初始数组,每个列使用列宽,然后覆盖要隐藏的列,最后循环数组并调用
set\u column()

事实证明,有些excel阅读器对隐藏列的方式并不相同:有些可能不会被隐藏。谢谢!设置数值范围确实更好。事实证明,不同的excel阅读器对这种隐藏方式的处理方式不同,例如,范围边界处的某些列可能不会被隐藏。出于不清楚的原因,给出列的原始宽度而不是
undef
,如下$worksheet->set_column('K:M',60,undef,1);这将为我设法访问的所有读者隐藏列,但对我来说也没有多大意义-至少,如果这对于保持原始宽度很重要,那么为什么在建议使用
unde
的文档中没有提到它