我使用Excel :: Writer :: XLSX perl模块导出到Excel。除了大量出口需要很长时间之外,它工作得很好。但是,当我添加$ workbook-> set_optimization();我只在.xlsx文件中获取数字数据。
我尝试过使用$ worksheet-> write()和$ worksheet-> write_string()但是当我使用$ workbook-&gt时,任何有字符串而不是数字的字段都会被排除在导出之外; set_optimization();
如果我使用较旧的Spreadsheet :: WriteExcel模块,它可以正常工作,但导出的文件大小要大得多,24MB对比7MB
以下是创建标题行的代码:
# Create a new workbook
my $workbook = Excel::Writer::XLSX->new($file_path);
$workbook->set_optimization();
my $worksheet = $workbook->add_worksheet();
# insert the header row
my $header_cnt = 0;
foreach my $header_cell (@header_values){#loop through each header column and add it to the sheet
# print $header_cell." - ".$header_cnt."\n";
# $worksheet->write_string("0", $header_cnt, "test");
$worksheet->write_string("0", $header_cnt, $header_cell);
$header_cnt++;
}
$workbook->close() or die "Error closing file: $!";
答案 0 :(得分:2)
在set_optimization()
模式下编写数字或字符串应该没有问题。实际上有several test cases just like that。
我使用一些示例数据运行了程序的变体,输出显示正确。
#!/usr/bin/perl -w
use strict;
use Excel::Writer::XLSX;
my $workbook = Excel::Writer::XLSX->new('test.xlsx');
$workbook->set_optimization();
my $worksheet = $workbook->add_worksheet();
my @header_values = ( 1, 2, 3, 'foo', 'bar', 6, 7 );
my $header_cnt = 0;
for my $header_cell (@header_values){
$worksheet->write(0, $header_cnt, $header_cell);
$header_cnt++;
}
$workbook->close();
请注意,字符串左对齐,右边的数字表示Excel将它们视为字符串和数字数据。
此外,如果您使用write_string()
方法,那么无论如何都会得到一个字符串。
您遇到的问题可能是在优化模式下,您需要按行列顺序写入数据,即该行中的每一行和每一列必须按顺序写入。
例如,如果您在for循环后添加这些行,则第二个数据将不会以优化模式显示:
$worksheet->write('A2', "This is fine");
$worksheet->write('A1', "I'm too late.");
答案 1 :(得分:0)
为了减少内存使用量,使用了set_optimization()方法,它不会将数据限制为数字。它既可以处理数字也可以处理字符串。
循环遍历每一行
foreach my $record (@records){
$row++;
$col = 0;
foreach my $data (@{$record}){
$worksheet->write($row,$col,$data);
$col++;
}
}
请参阅此链接https://github.com/AarthiRT/Excel_Writer_XLSX中的“Write_largeData_XLSX.pl”以获取更多详细信息。