在 PHP 開發中,匯入 Excel 資料是常見需求。本文提供一個完整的 Spreadsheet_Excel_Reader 類別實作,支援 BIFF 7 與 BIFF 8 格式(即 .xls 檔案),可直接解析儲存格數值、日期、公式等資料,並處理合併儲存格、字串共用表(SST)等細節。
程式碼包含兩大核心類別:
OLERead::read() 讀取檔案,驗證 OLE 標識符(D0 CF 11 E0 A1 B1 1A E1),解析大區塊鏈、小區塊鏈、屬性儲存表,最終透過 getWorkBook() 取得 Workbook 二進位資料。
_parse() 依序處理:
BOF:確認版本(BIFF7/BIFF8)與子流類型(Workbook Globals)。SST:共用字串表,支援 Unicode、Rich Text、延續記錄。FORMAT、XF:儲存格格式與擴展格式,自動判斷日期、數字、百分比等類型。BOUNDSHEET:記錄工作表名稱與偏移位置。_parsesheet() 針對每個工作表處理:
DIMENSION:取得列/欄範圍。MERGEDCELLS:記錄合併儲存格的 rowspan/colspan。RK、NUMBER、FORMULA、LABELSST、BOOLERR:各類儲存格資料類型,自動套用格式化轉換為字串與原始值。createDate() 依 1900/1904 紀元計算 Unix 時間戳;createNumber() 與 _GetIEEE754() 處理 IEEE 754 雙精度浮點數與 RK 格式整數編碼。
<?php
$data = new ReadexcelSystem();
$data->setOutputEncoding('utf-8');
$data->read('/path/to/file.xls');
print_r($data->sheets[0]['cells']);
?>
$data->sheets[0]['cells'] 為二維陣列 [row][col] => 格式化後字串,cellsInfo 則包含 type(date/number/unknown)、raw 原始值。
PhpSpreadsheet。iconv,可改用 mb_convert_encoding。