PHPExcel是一個十分強大的文檔產生PHP開源類庫,它不僅支援產生Excel(.xls)、Excel2007(.xlsx)文檔,同時也支援PDF、HTML、CSV文檔的產生。此外,PHPExcel還支援以現有的Excel文檔為模板填充資料產生新的以上文檔。並且,其本身的API文檔和樣本demo相當完整,非常有助於開發人員使用。
PHPExcel的官方網站如下:
http://phpexcel.codeplex.com/
當前的版本是1.7.6,下載解壓後的PHPExcel的目錄結構如下所示:
其中:
Classes目錄下是PHPExcel的原始碼檔案:PHPExcel.php檔案是類庫的介面,外部的PHP代碼通過它來實現對PHPExcel的調用;PHPExcel目錄下是各種不同文檔(如Excel、Excel2007、PDF等)的讀取和產生的具體作業碼,它們由Classes目錄下的PHPExcel.php檔案通過原廠模式統一進行調用。
Documentation目錄下是PHPExcel的官方協助文檔,尤其是API目錄下網頁檔案全部是PHPExcel的API協助文檔,而其它的則是對這個開源項目的介紹。
Tests目錄下是PHPExcel的將近40個樣本小程式,可以與Classes目錄一同放到Apache+PHP環境下進行測試與學習。
下面是PHPExcel中一些常用的程式碼片段:
<?php// 匯入PHPExcel類庫require_once("Classes/PHPExcel.php");// 通常PHPExcel對象有兩種執行個體化的方式// 1. 通過new關鍵字建立空白文檔$phpexcel = new PHPExcel();// 2. 通過讀取已有的模板建立$phpexcel = PHPExcel_IOFactory::createReader("Excel5")->load("template.xls");/** * 執行個體化之後的PHPExcel對象類似於一個暫存於記憶體中文檔檔案, * 可以對它進行操作以達到修改文檔資料的目的 */// 設定文件屬性$phpexcel->getProperties()->setCreator("Liu Jian") // 文檔作者 ->setLastModifiedBy("Liu Jian") // 最後一次修改者 ->setTitle("Office 2003 XLS Test Document") // 標題 ->setSubject("Office 2003 XLS Test Document") // 主題 ->setDescription("Test document for Office 2003 XLS, generated using PHPExcel.") // 備忘 ->setKeywords("office 2003 openxml php") // 關鍵字 ->setCategory("Test result file"); // 類別 // 預設狀態下,新建立的空白文檔(通過new)只有一個工作表(sheet),且它的編號(index)為0// 可以通過如下的方式添加新的工作表$phpexcel->createSheet(1);// 擷取已有編號的工作表$sheet = $phpexcel->getSheet(1);// 設定當前啟用的工作表編號$phpexcel->setActiveSheetIndex(1);// 擷取當前啟用的工作表$sheet = $phpexcel->getActiveSheet();// 得到工作表之後就可以操作它的儲存格以修改資料了// 修改工作表的名稱$sheet->setTitle("Test");// 設定儲存格A5的值$sheet->setCellValue("A5", date('Y-m-d h:i:s'));// 設定第3行第5列(E3)的值$sheet->setCellValueByColumnAndRow(4, 3, date('Y-m-d h:i:s'));// 擷取儲存格A5的值$sheet->getCell("A5")->getValue();// 合併儲存格$sheet->mergeCells("C3:G6");// 拆分合并的儲存格$sheet->unmergeCells("C3:G6");// 設定第3行的屬性$sheet->getRowDimension(3)->setRowHeight(100) // 行高 ->setVisible(true) // 是否可見,預設為true ->setRowIndex(6) // 變更行號為6 ->setOutlineLevel(5); // 優先順序別,預設為0,參數必須是0到7// 設定第F列的屬性// getColumnDimension("F")可以用getColumnDimensionByColumn(5)代替$sheet->getColumnDimension("F")->setWidth(200) // 列寬 ->setColumnIndex("I") // 變更列號為I ->setVisible(false) // 是否可見 ->setAutoSize(true); // 自動適應列寬// 在第3行前面插入1行,該行將變成新的第3行,其它的依次下移1行$sheet->insertNewRowBefore(3, 1);// 在第C行前面插入1列,該列將變成新的第C列,其它的依次右移1列$sheet->insertNewColumnBefore("C", 1); // 方法一$sheet->insertNewColumnBeforeByIndex(2, 1); // 方法二,第C列又是第2列// 擷取儲存格D3的樣式對象$style = $sheet->getStyle("D3"); // 等價於getStyleByColumnAndRow(3, 3)// 設定該儲存格的字型屬性$style->getFont()->setBold(true) // 是否粗體 ->setSize(16) // 字型大小 ->setName("Gungsuh") // 字型名,只適用於外文字型 ->setItalic(true) // 是否斜體 ->setStrikethrough(true) // 是否有刪除線 ->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING) // 底線類型 ->getColor()->setARGB(PHPExcel_Style_Color::COLOR_BLUE); // 字型顏色 // 設定該儲存格的背景填充屬性$style->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID) // 填充模式 ->getStartColor()->setARGB(PHPExcel_Style_Color::COLOR_YELLOW); // 背景顏色// 設定該儲存格中數位格式$style->getNumberFormat()->setFormatCode("0.00");// 設定該儲存格中文本對齊$style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平方向 ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直方向$sheet->setCellValue("D3", "12.3456");// 在本地儲存文檔PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5')->save("output.xls");// 輸出文檔到頁面header('Content-Type: application/vnd.ms-excel');header('Content-Disposition: attachment;filename="test.xls"');header('Cache-Control: max-age=0');PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5')->save('php://output');?>
需要注意的是:
1. PHPExcel本身具有在儲存格中插入圖片以及設定儲存格邊框的相關函數,但是個人感覺動態添加圖片、設定邊框遠沒有使用靜態excel模版來產生文檔更好用。實在需要的情況下可以參見最後的參考資料。
2. 添加新的行或列時,新的行或列的樣式(style)會自動與新行/列的前一行/列保持一致。
3. 設定儲存格填補值顏色時,必須先設定填充模式,否則會失效。
4. 通過PHPExcel_IOFactory的靜態方法createReader或createWriter,必須傳入文檔格式所對應的參數字串,其中:
- Excel5對應Excel 2003(.xls)
- Excel2007對應Excel 2007(.xlsx)
- PDF對應PDF(.pdf)
- CSV對應CSV(.csv)
輸出文檔時,檔案的副檔名必須與該參數字串相契合。