轉載自:https://tlanyan.me/use-phpexcel-to-read-and-write-excel/
PHPOffice出品的PHPExcel是PHP讀取和生成Excel的極佳工具。本文參考官方文檔,對PHPExcel進行簡要總結,希望對使用PHPExcel操作Excel的同行有幫助。
PHPExcel介紹
PHPExcel是用PHP實現的電子表格文檔讀寫類庫,其支持的文檔類型包括:Excel(.xls)後綴,Excel 2007(.xlsx後綴),CSV(.csv後綴),LibreOffice Calc(.ods後綴),PDF和HTML等格式(某些格式只能讀)。PHPExcel運行環境爲PHP 5.2+,需要開啓php_zip、php_xml和php_gd2拓展。
細心的讀者可能看到PHPOffice有另外一款作品:PHPSpreadsheet。PHPSpreadsheet也是一個Excel讀寫類庫,與PHPExcel主要區別是:
- PHPSpreadsheet是PHPExcel的重構版,基於PHP的新特性進行了重寫。PHPSpreadsheet要求PHP 5.6+,使用了名字空間、PSR2編碼規範、最新的PHP語言新特性;
- 對PHP版本的要求加強。官方的PHP版本支持結束後,PHPSpreadsheet對該版本至多額外支持6個月(意味肯定不支持PHP 5.5及以下版本,PHP5.6的支持也即將終止)。對比之下,PHPExcel依然支持PHP 5.2.0;
- 開發組已將所有資源轉移到PHPSpreadsheet,PHPExcel的維護已經停止。
PHPSpreadsheet已經放出1.0.0穩定版,官方不再建議使用PHPExcel。本文內容主要講解PHPExcel,掌握透徹後再轉換到PHPSpreadsheet也是很容易的。
PHPExcel架構
理解PHPExcel的架構,可以先從理解Excel文件的結構開始。一個Excel文件包含多個表單,每個表單包含多個單元;文件、表單和單元都可以單獨設置屬性。這些概念對應到PHPExcel中的類,關係如下:
- PHPExcel類 < -> Excel文件
- PHPExcel_Worksheet類 < -> 表單
- PHPExcel_Cell < -> 單元
- PHPExcel_DocumentProperties < -> 文件屬性
- PHPExcel_Style_* < -> 格式設置類
下面開始介紹PHPExcel的常用操作。
使用PHPExcel
根據上面介紹的關係,分excel文件、表單、單元、格式設置四個部分分別介紹PHPExcel的使用方法。
excel文件
一個PHPExcel類的實例代表一個excel文件。新生成的PHPExcel對象,經常需要保存爲文件;反之excel文件常需要導入爲PHPExcel實例。保存和導入的行爲分別由writer和reader負責。爲了正確導入和保存數據,reader和writer需要知道具體的文件格式。PHPExcel提供了工廠類PHPExcel_IOFactory簡化reader和writer的創建。讀寫文件的示例代碼如下:
1 2 3 4 5 6 7 | // 讀取文件,自動探測文件格式 $excel = PHPExcel_IOFactory::load("./foo.xlsx"); // 新建excel文件,保存爲Excel 2007格式 $excel2 = new PHPExcel(); $writer = PHPExcel_IOFactory::createWriter($excel2, "Excel2007"); $writer->save("./foo2.xlsx"); |
如果知道具體格式,可以使用具體的類操作:
1 2 3 4 5 6 7 | // 讀文件 $reader = PHPExcel_Reader_Excel2007(); $excel = $reader->load("./foo1.xlsx"); // 寫文件 $writer = PHPExcel_Writer_Excel2007($excel); $writer->save("./foo2.xlsx"); |
可用的reader和writer類可以參考下圖:
建議使用工廠方法讀取文件,它能自動探測文件格式並加載。這在讀取用戶上傳不同格式的文件時很有用,避免了格式與後綴名不符可能導致的錯誤。
注意不要混淆PHPExcel和writer/reader對象:PHPExcel持有數據,writer和reader是對其進行序列化和反序列化的輔助類。
表單操作
一個excel文件可以包含多個表單,常用操作包括讀取、新建、複製和刪除表單。表單從屬於excel文件,一般需要掛載到具體的PHPExcel對象上。
獲取表單的方式有多種,如獲取當前表單、獲取指定順序表單、根據名字獲取表單。以下是示例代碼:
1 2 3 4 | $sheet = $excel->getActiveSheet(); // 獲取第二個表單,編號從0開始 $sheet = $excel->getSheet(1); $sheet = $excel->getSheetByName("Worksheet 1"); |
創建表單分爲直接excel文件對象直接創建,也可以先創建表單實例,後續再關聯。對應方法爲:
1 2 3 4 5 6 | $excel->createSheet(); $sheet = new PHPExcel_Worksheet($excel, "sheet 1"); // 一些其他操作 // 作爲第二個表單插入到文檔中 $excel->addSheet($sheet, 1); |
PHPExcel也支持複製表單(包括複製其他PHPExcel對象中的表單):
1 2 3 4 5 6 | // 複製表單 $sheet = clone $excel->getSheet(0); $sheet->setTitle("new sheet"); $excel->addSheet($sheet, 1); // $excel->addExternalSheet可以添加其他文件的表單 |
刪除表單的API比較簡單,只提供了removeSheetByIndex
一個方法:
1 2 3 4 5 6 7 | // 刪除最後一個表單 $index = $excel->getSheetCount() - 1; $excel->removeSheetByIndex($index); // 刪除當前表單 $index = $excel->getIndex($excel->getActiveSheet()); $excel->removeSheetByIndex($index); |
單元操作
單元是承載內容的主體,其上操作比較複雜,大部分的類和API都與單元相關。單元隸屬於具體的表單,使用上和表單類互動最多。
常用操作的包括定位、取值/賦值、格式化等。下面是一些代碼示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | // 獲取單元對象 $cell = $sheet->getCell("B1"); $cell = $sheet->getCellByColumnAndRow(1, 1); // 取值 $value = $cell->getValue(); $value = $cell->getCalculatedValue(); // 獲取計算後的值 $style = $cell->getStyle(); // 獲取格式化對象 $isMerged = $cell->isMergeRangeValueCell(); //是否是合併單元的主單元(合併單元的左上角單元) // 設置值 $sheet->setCellValue("B1", "TEST"); $sheet->setCellValueByColumnAndRow(1, 1, "TEST"); // 批量賦值 $data = [ [2009, 2010, 2011, 2012], ['Q1', 12, 15, 21], ['Q2', 56, 73, 86], ['Q3', 52, 61, 69], ['Q4', 30, 32, 0], ]; $sheet->fromArray($data); $cell->setValue("foo"); // 顯示賦值 $cell->setValueExplicit("123456788900", PHPExcel_Cell_DataType::TYPE_STRING); // 合併單元 $sheet->mergeCells('A18:E22'); // 設置格式 // 設置字體爲紅色 $cell->getStyle()->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED); // 設置邊框 $cell->getStyle()->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK); |
文件屬性
設置excel文件的屬性,包括常見的作者、標題、創建時間、描述等。該功能由PHPExcel中類型爲DocumentProperties的成員變量負責:
1 2 3 4 | $property = $excel->getProperties(); $property->setCreator("tlanyan"); $property->setTitle("demo workbook"); $property->setKeywords("tlanyan, PHPExcel"); |
其他
上述介紹了常見的概念和操作,實際中可能會用到的概念還包括:
- 緩存和性能
- 圖像、圖表、超鏈接等富文本
- 日期、貨幣等格式化和本地化
- 公式設置
- 打印屬性設置
- 內容對其、邊距設置等
- 文件密碼安全設置
這些冷門或高級功能可以參照API文檔。
PHPExcel官方文檔可能稍有繁雜,網絡上的二手資料在深入方面常有欠缺。要用好PHPExcel,一個基本功是搞清楚操作的對象,以及和其他類/對象的關係(這也是面向對象編程的基本功)。本文中提到的PHPExcel->PHPExcel_WorkSheet->PHPExcel_Cell繼承體系,是使用過程中操作最爲頻繁的對象,希望以上說明和示例能加深讀者對PHPExcel類庫的理解。