2008年5月31日 星期六

以 PHP 讀取 Excel 檔案的資料

在 PHP 中有提供 fgetcsv 和 fputcsv 讓我們讀取 CSV 格式的檔案,以前都是用偷吃步的方式,先將 Excel 檔案另存為 .csv 的格式,再使用前面兩個函數來讀取或輸出檔案,反正 .csv Excel 也可以吃。不過,.csv 中只能存一個工作表,這個應該是一個缺陷。最近正在著手寫一個程式,它必須要能讀取使用者上傳的 Excel 檔案中的資料, google 了一下,原來已經有人寫了一個叫 phpExcelReader 的 class,可以讓我們很方便的讀取任一個工作表。它的網址如下:
該 class 使用的方法可以參考網站下載回來的壓縮檔中的 example.php。
不過我下載回來的 (版本 2007-07-05 19:57),有兩點要注意:
  • reader.php 中的下面這行要修改
    將 require_once 'Spreadsheet/Excel/Reader/OLERead.php';
    改為 require_once 'oleread.inc';
  • example.php 中
    修改 $data->setOutputEncoding('CP1251');
    為 $data->setOutputEncoding('CP950');
    不然中文會有問題。
    修改 $data->read('jxlrwtest.xls');
    為自己的 excel 檔檔名,zip 檔中附的 jxlrwtest.xls 應該是壞了。
用了一下,還滿不錯的!解決了我一個大難題。

試著在不同機器上測試,同一個程式,卻發現有一台機器的輸出有問題,Excel 中的所有中文字都沒讀出來。由於 Excel 的中文是以 'UTF-16LE' 的編碼儲存,所以 phpExcelReader 是利用 php 中的 iconv 來轉碼,而那台機器的 libiconv 版本太舊了,才會無法正常的轉碼。我將 FreeBSD 上的 libiconv 更新為 libiconv-1.11_1,並且重新編譯 php4-iconv 的 ports,安裝完新版的 php4-iconv 後,中文就可以正常的輸出了。

不過,在編譯 php4-iconv 的 ports 時出現了小插曲,原來的 php4 是使用 autoconf253,但是一直出現下面的錯誤訊息:
  • configure: error: tag name "CXX" already exists
試了一下,修改 /usr/ports/Mk/bsd.php.mk 中的下面這行:
  • WANT_AUTOCONF_VER= 253
改成
  • WANT_AUTOCONF_VER= 259
再重新 make 後,總算是把 php-iconv 編譯好。

1 則留言:

  1. 感謝你提供的修改方式!!
    已經成功讀取EXCEL黨~

    是否可以再請教你一個問題
    就是如果讀取檔案時EXCEL目前是無換行的讀出

    如果希望讀的時候可以按照EXCEL的格式讀出是否有這樣的方式可以執行@@

    回覆刪除

 
© 2009. Design by Pocket