2013-02-14 24 views
1

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

我曾尝试使用$ worksheet-> write()和$ worksheet-> write_string(),但任何具有字符串而不是数字的字段在使用$ workbook-> set_optimization时不会被导出();

如果我使用旧的电子表格:: 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: $!"; 

回答

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(); 

example output

注意,字符串左对齐和数字来表明Excel将它们视为字符串和数字数据的权利。

另外,如果你使用write_string()方法,那么你将在任何一种情况下得到一个字符串。

您遇到的问题可能是在优化模式下,您需要按行列顺序写入数据,即该行中的每行和每列必须按顺序写入。

例如,如果你后的for循环中加入这些行的第二个数据将不会在优化模式中显示:

$worksheet->write('A2', "This is fine"); 
$worksheet->write('A1', "I'm too late."); 
+0

感谢您的快速回复。我复制你的代码并运行它,只有数字出现在输出中。当我注释掉set_optiomization();然后我得到所有的数据(数字和字符串)。 – nickradford 2013-02-14 16:24:34

+0

你用什么来查看输出文件?我没有购买截图。数据确实显示在Excel中。 :-) – jmcnamara 2013-02-14 16:25:17

+0

我一直在OS X上使用Numbers来查看这些文件。但是,我只是在Windows上的Excel中打开该文件,并且数据都在那里。 – nickradford 2013-02-14 16:28:25

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” 的更多细节。

相关问题