這幾天在試用Spreadsheet::WriteExcel這個perl的module用的滿順的,因為之前習慣用PHP的Spreadsheet/Excel/Writer.php,雖然放棄了用PHP的這個模組寫,因為太舊了,有些我在excel 2003要用的功能無法滿足我,只好跳回來用perl來寫,這時候的我其實對perl還滿恐懼的,為啥不用java的apache POI呢?其實我也試過了,不過當我直接用範例來試的時候,發現有版本別的問題,在還搞不清楚下,我很快的就投降了,然後改投懷抱到perl這裡來,用的真是令人愉快!
不過我用DBD:DB2這個模組時,一直產生DBD::DB2::db prepare failed: Error calling SQLGetInfo這類的錯誤,但是卻沒影響執行,先暫時忍受,有空再解決。
寫入excel的問題解決了,接下來還需要讀一個excel,這個任務可以交由Spreadsheet::ParseExcel,但是當我直接用網站上的這個例子測試時:
use strict; use Spreadsheet::ParseExcel; my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file); foreach my $sheet (@{$excel->{Worksheet}}) { printf("Sheet: %sn", $sheet->{Name}); $sheet->{MaxRow} ||= $sheet->{MinRow}; foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) { $sheet->{MaxCol} ||= $sheet->{MinCol}; foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) { my $cell = $sheet->{Cells}[$row][$col]; if ($cell) { printf("( %s , %s ) => %sn", $row, $col, $cell->{Val}); } } } }
真慘,一直出不了中文,我的是繁體中文的,Google了兩天,一直不斷的用簡體中文的範例做測試,當然我有將CP936改成CP950,但是一堆問題迎面而來:
Use of uninitialized value in scalar assignment at D:/xampp/perl/site/lib/Spread
sheet/ParseExcel/Utility.pm
“x{00aa}” does not map to big5-eten at D:/xampp/perl/site/lib/Spreadsheet/Parse
Excel/Utility.pm
舉如這些的問題,以及unicode、utf-8、big5等等轉碼的想法都去測試,但是我努力了兩天,都無效,最後開始其求神祝我一臂之力了,留言給兩個網友,不過應該不會這麼快有答案,就在快放棄時,又回到他的論壇討論區去看看:
看到了這個回覆的留言http://www.cpanforum.com/posts/9292
ㄝ?怎有Cell->{_Value}這樣的使用方式,不是一直都是用Cell->{Val}嗎?這下有點眉目了,我回去再看說明,終於看到這兩個屬性的使用,當我改用_Value這個屬性時,我終於解決的我的問題,這時的我有點Orz!如果有好好看手冊,那就ok了,終於在下班前完成這個測試,明天放長假(很長的假喔!9天長不長)後再回公司繼續寫吧!
原來阿琪也有在寫 Perl,剛好最近我在學(我是新手)。有機會可以交流一下 ^^
很好玩吧!