Perl – Spreadsheet :: WriteExcel函数的解释
我想使用function“autofit_columns”在这里find: CPAN
这是我的程序到目前为止(我跳过数据库连接和查询部分)
my $workbook = Spreadsheet::WriteExcel->new("TEST.xls"); my $bold = $workbook->add_format(); $bold->set_bold(); my $number = $workbook->add_format(); $number->set_num_format(0x01); $worksheet = $workbook->add_worksheet('Sheet1'); my @headings = ('Blabla...'); foreach $i (@headings){ $worksheet->write(0, $col++, $i, $bold); }; $col=0; $lrow=1; while (@row = $sth->fetchrow_array()) { $worksheet->write($lrow,$col,\@row); $lrow++; }; $sth->finish; $dbh->disconnect; autofit_columns($worksheet); $workbook->close(); sub autofit_columns { my $worksheet = shift; my $col = 0; for my $width (@{$worksheet->{__col_widths}}) { $worksheet->set_column($col, $col, $width) if $width; $col++; } }
问题:我的列不是自动在xls文件中…任何想法为什么?
我没有得到代码的peice:
for my $width (@{$worksheet->{__col_widths}}) { $worksheet->set_column($col, $col, $width) if $width; $col++; }
您需要再次查看该示例,并在将任何内容写入工作表之前实现add_write_handler
部分。
请看看
$worksheet->add_write_handler(qr[\w], \&store_string_widths);
然后在store_string_widths
子程序中执行。
答案是你需要在每次写入时存储string的绝对宽度。 然后,在将所有数据写入工作表之后,您需要遍历行并为每列find最大string的“长度” – 这将是期望的列宽。
祝你好运。
您缺less添加callback函数的示例代码部分:
$worksheet->add_write_handler(qr[\w], \&store_string_widths);
您还缺lessstore_string_widths()
函数。
关于你的第二个问题,callback存储了每列使用的最大string长度。 代码片段使用这些长度来设置存储长度的第一列到最后一列的每列的列宽。 如果一列没有存储自动assembly宽度,那么它的宽度不会被调整。
这在Spreadsheet :: WriteExcel中有点难以理解。 它将更多地集成到Excel :: Writer :: XLSX这个替代WriteExcel的模块中。