PHP處理Excel

Excel文件格式

BIFF
BIFF(Binary Interchange File Format)從Excel97 - Excel2003使用的是BIFF version 8,可是說BIFF8是目前最廣泛使用的Excel版本。BIFF8基於微軟的複合文檔格式。
OOXML
以上是Microsoft官方的介紹,個人感覺說的比較虛。Word,PPT等Office組件的文件格式還沒有研究過,僅針對Excel2007的文件格式來說,簡單說來它就是一組XML文檔的集合,進行ZIP壓縮後的結果再重新命名爲xlsx。
如果想深入研究Excel2007文件格式的話,比較簡單的做法是將文檔的後綴名(xlsx)改爲zip,然後解壓後就能看到真實的XML的文件組織結構。針對Excel2007的文件格式來說還是比較簡單的,而且文件的組織及內容都比較容易理解。
處理方法
PHP處理Excel的方法將BIFF、OOXML轉換成csv後再處理
嚴格的說這不是一個處理Excel文檔的方法。將BIFF、OOXML文檔轉換成CSV的文本格式,然後再用PHP解析這個文件,跨平臺,效率比較高、可以用來讀取Excel,也可以用於生成Excel。不過只能直接使用CSV的文件,如果經常處理BIFF、OOXML文檔的話需要手工轉換,不能自動化,可能會造成數據丟失,並且CVS文檔中一個文件只有一個SHEET。
Windows下通過COM處理Excel
Windows環境下可以通過COM組件來解析Excel,可以用來讀取Excel也可以用來生成Excel,由於沒有Windows的開發環境,所以這種方法沒有進行測試,PHP手冊上有相關的例子,而且網上也有相關的文章。此種方式的最大問題就是隻能應用於Windows平臺。
使用第三方提供的類庫處理Excel
使用PHP的第三方類庫解析Excel文件,跨平臺。某些類庫支持寫操作。支持BIFF、OOXML文件格式。不過,某些類庫由於實現者的水平導致不同的類庫質量參差不齊甚至可能存在bug、性能不高、內存佔用過大等問題。並且很多第三方類庫的更新不及時或已停止更新。在PHP處理Excel的第三方類庫中,發現的無論功能還是更新維護上做的比較好的只有PHPExcel。
PHP調用第三方程序或服務來處理Excel
可以用C++,Java,Python等語言編寫處理Excel的程序或服務,PHP在調用相關的程序或服務來處理Excel,第三方程序或服務將處理好的結果返回給PHP。
這實際上不是一個實際使用PHP處理Excel的方法,但不失爲一種解決PHP處理Excel的問題的方法。
生成符合規範的XML來生成僞Excel
在服務器端生成符合規範的XML,再向瀏覽器輸出相應的協議頭,可以生成僞Excel,此種方法可以,可以生成簡單的效果,但此種方法生成的Excel實際上是XML文檔,當再次編輯的時候會出現問題。
PHP處理Excel的第三方庫PHPExcel
現在最新的版本是,發佈。PHPExcel是一個相當強大的 MS Office Excel 文檔生成類庫,當需要輸出比較複雜格式數據的時候,PHPExcel 是個不錯的選擇,並且文檔做的也比較好,有比較好的函數參考手冊。
PHPExcel在處理Excel2007(OOXML)文檔時會有一點問題。由於PHPExcel是先將Excel文件加載進內存,並在內存中構建OOXML的文檔結構,所以在處理複雜或不規範的Excel2007文檔時會造成進程內容佔用過大,而且初始化文檔模型的時間開銷也很大,甚至不能接受。
以上問題在Excel1.6.5之前的版本還不是特別嚴重,因爲PHPExcel1.6.5之前的版本,PHPExcel只會對列號在“A-ZZ”範圍內的單元格進行處理,自PHPExcel1.6.5起去掉了這個限制,故如果Excel2007文檔不規範可能會造成在內存中構建文檔模型的時候內存開銷過大。
在調研過程中,下載了PHPExcel1.6.4-PHPExcel1.7.2版本進行測試,測試時使用的Excel文檔的單元格數據驗證部分定義的不規範,5個驗證條件涉及的單元格都在4000個以上,實際有用的單元格只有幾個,在PHPExcel1.6.4之前的版本,會忽略掉ZZ列之後的單元格,由於有此限制除了內存佔用多一些,加載時間長一些外一般不會出現嚴重的問題,但在PHPExcel1.6.5之後的版本直接在加載驗證條件部分出現了內存溢出(內存限制設置爲128MB,溢出時大概加載了1/2的驗證條件)。
因此,如果使用PHPExcel進行解析Excel2007文檔時,儘可能的使用規範的文檔模板。在不能控制Excel2007文檔的情況下,如果Excel2007文檔的結構相對比較簡單,但是要處理大型複雜的OOXML文檔,最好還是根據實際的需求來開發簡單的組件來進行解析,或根據實際情況對PHPExcel進行修改或裁剪。
PHPExcelReader
看到這個名字就可以推斷出這個第三方類庫只能用於讀取Excel而不能用於生成Excel,網上關於PHPExcelReader的文章比較多,但是PHPExcelReader的問題也比較多,最後更新時間是(這個庫的確比較老了),並且僅支持BIFF格式(Excel97 - Excel2003),解析速度較快。只能處理簡單的Excel文檔,不支持富文本的處理,並且在處理日期類型時會有bug,個人感覺不是很實用。
PHP處理Excel方法總結
綜上所述,各種處理Excel的方法都有各自的優點和缺點,網絡上PHP處理Excel的第三方庫雖然爲數不少,但真正能應用與生產環境的並不多,以上介紹的PHPExcel及PHPExcelReader只是暫時發現的比較好用的第三方庫。
在實際的開發中,如果涉及到需要處理Excel的需求是,比較推薦的是以下幾種方法:
使用第三方庫PHPExcel進行解析
原因:在第三方庫中PHPExcel相對來說從功能,質量到維護對算比較好的。
PHP調用第三方程序或服務來處理Excel
原因:相對於PHP來說Java、Python等語言的相關第三方組件可能會更成熟些,而且如果發現所選用的組件出現問題,比較容易進行更換。
自己開發簡單的組件來解析Excel
原因:相對來說Excel的文件結構不是很複雜,自己開發簡單的組件成本也不會很大。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章