2011-10-17 55 views
3

我想使用的功能「autofit_columns」爲在這裏找到:CPAN的Perl - 表格:: WriteExcel功能說明

這是我的計劃至今(我跳過了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文件中......任何想法爲什麼?

我不明白的代碼peice的:

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

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

回答

2

你需要在這個例子再看看,太實現add_write_handler一部分,你寫東西到工作表之前。

請看看

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

線,然後在store_string_widths子程序執行。

答案是你需要在每次寫入時存儲字符串的絕對寬度。然後,在將所有數據寫入工作表後,您需要遍歷行併爲每列找到最大字符串的「長度」 - 這將是期望的列寬。

祝你好運。

2

你缺少的,增加了回調函數的示例代碼部分:

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

您還缺少store_string_widths()功能。

相對於第二個問題,回調函數存儲每列使用的最大字符串長度。代碼片段使用這些長度來設置存儲長度的第一列到最後一列的每列的列寬。如果某列未存儲自動裝配寬度,則其寬度不會被調整。

這是Spreadsheet :: WriteExcel中的一個小問題。它將更多地集成到Excel :: Writer :: XLSX模塊中,這是WriteExcel的替代品。

+0

+1 for Excel :: Writer :: XLSX。我喜歡你投入的工作,請保持它。 – Joel

+0

嗨,是的,謝謝你......後來我發現我錯過了一半的代碼。這是一個非常有趣的一天,我掙扎了很多,但最終出來了一個很好的報告。 我認爲先開始使用Spreadsheet :: Excel會更安全,但我會看看XLSX模塊。 有些客戶仍在使用舊版本的Excel,因此它仍然是目前的最佳選擇。 謝謝。 – Rgonomike