Perl - Spreadsheet :: WriteExcel函数说明

时间:2011-10-17 10:30:58

标签: perl excel module

我想使用此处的“autofit_columns”功能:CPAN

到目前为止,这是我的程序(我跳过了DB连接和查询部分)

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文件中自动调试...任何想法为什么?

我没有得到代码:

for my $width (@{$worksheet->{__col_widths}}) {

                $worksheet->set_column($col, $col, $width) if $width;
                $col++;
            } 

2 个答案:

答案 0 :(得分:2)

在向工作表写任何内容之前,您需要再次查看该示例并实现add_write_handler部分。

请看一下

$worksheet->add_write_handler(qr[\w], \&store_string_widths);

行,然后在store_string_widths子程序实现。

答案是你需要在每次写入时存储字符串的绝对宽度。然后,在将所有数据写入工作表之后,您需要遍历行并找到每列最大字符串的“长度” - 这将是所需的列宽。

祝你好运。

答案 1 :(得分:2)

您缺少添加回调函数的示例代码部分:

$worksheet->add_write_handler(qr[\w], \&store_string_widths);

您也缺少store_string_widths()功能。

关于第二个问题,回调存储每列使用的最大字符串长度。代码段使用这些长度来设置从存储长度的第一列到最后一列的每列的列宽。如果列没有存储自适应宽度,则不调整其宽度。

这在Spreadsheet :: WriteExcel中有点小巧。它将更多地集成到Excel :: Writer :: XLSX中的模块中,它是WriteExcel的替代品。