1

我正在使用 Excel::Writer::XLSX perl 模块导出到 Excel。它工作得很好,除了大型出口需要很长时间。但是,当我添加 $workbook->set_optimization(); 我只在 .xlsx 文件中获取数字数据。

我尝试同时使用 $worksheet->write() 和 $worksheet->write_string() 但是当我使用 $workbook->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: $!";
4

2 回答 2

2

set_optimization()模式下写入数字或字符串应该没有问题。实际上有几个测试用例就是这样

我使用一些示例数据运行了您的程序的一个变体,并且输出正确显示。

#!/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.");
于 2013-02-14T16:11:49.043 回答
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” 。

于 2017-05-18T15:00:08.440 回答