2013-02-14 25 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」 的更多細節。

相關問題