苦戰Spreadsheet::ParseExcel

這幾天在試用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天長不長)後再回公司繼續寫吧!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

2 則留言

  1. 原來阿琪也有在寫 Perl,剛好最近我在學(我是新手)。有機會可以交流一下 ^^

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *