轉載請註明文章出處:https://tlanyan.me/use-phpexc...
PHPOffice出品的PHPExcel是PHP讀取和生成Excel的極佳工具。本文參考官方文檔,對PHPExcel進行簡要總結,但願對使用PHPExcel操做Excel的同行有幫助。php
PHPExcel是用PHP實現的電子表格文檔讀寫類庫,其支持的文檔類型包括:Excel(.xls)後綴,Excel 2007(.xlsx後綴),CSV(.csv後綴),LibreOffice Calc(.ods後綴),PDF和HTML等格式(某些格式只能讀)。PHPExcel運行環境爲PHP 5.2+,須要開啓php_zip、php_xml和php_gd2拓展。git
細心的讀者可能看到PHPOffice有另一款做品:PHPSpreadsheet。PHPSpreadsheet也是一個Excel讀寫類庫,與PHPExcel主要區別是:github
PHPSpreadsheet已經放出1.0.0穩定版,官方再也不建議使用PHPExcel。本文內容主要講解PHPExcel,掌握透徹後再轉換到PHPSpreadsheet也是很容易的。編程
理解PHPExcel的架構,能夠先從理解Excel文件的結構開始。一個Excel文件包含多個表單,每一個表單包含多個單元;文件、表單和單元均可以單獨設置屬性。這些概念對應到PHPExcel中的類,關係以下:緩存
下面開始介紹PHPExcel的經常使用操做。安全
根據上面介紹的關係,分excel文件、表單、單元、格式設置四個部分分別介紹PHPExcel的使用方法。網絡
一個PHPExcel類的實例表明一個excel文件。新生成的PHPExcel對象,常常須要保存爲文件;反之excel文件常須要導入爲PHPExcel實例。保存和導入的行爲分別由writer和reader負責。爲了正確導入和保存數據,reader和writer須要知道具體的文件格式。PHPExcel提供了工廠類PHPExcel_IOFactory簡化reader和writer的建立。讀寫文件的示例代碼以下:架構
// 讀取文件,自動探測文件格式 $excel = PHPExcel_IOFactory::load("./foo.xlsx"); // 新建excel文件,保存爲Excel 2007格式 $excel2 = new PHPExcel(); $writer = PHPExcel_IOFactory::createWriter($excel2, "Excel2007"); $writer->save("./foo2.xlsx");
若是知道具體格式,可使用具體的類操做:工具
// 讀文件 $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對象上。
獲取表單的方式有多種,如獲取當前表單、獲取指定順序表單、根據名字獲取表單。如下是示例代碼:
$sheet = $excel->getActiveSheet(); // 獲取第二個表單,編號從0開始 $sheet = $excel->getSheet(1); $sheet = $excel->getSheetByName("Worksheet 1");
建立表單分爲直接excel文件對象直接建立,也能夠先建立表單實例,後續再關聯。對應方法爲:
$excel->createSheet(); $sheet = new PHPExcel_Worksheet($excel, "sheet 1"); // 一些其餘操做 // 做爲第二個表單插入到文檔中 $excel->addSheet($sheet, 1);
PHPExcel也支持複製表單(包括複製其餘PHPExcel對象中的表單):
// 複製表單 $sheet = clone $excel->getSheet(0); $sheet->setTitle("new sheet"); $excel->addSheet($sheet, 1); // $excel->addExternalSheet能夠添加其餘文件的表單 </pre> 刪除表單的API比較簡單,只提供了`removeSheetByIndex`一個方法: <pre class="lang:php">// 刪除最後一個表單 $index = $excel->getSheetCount() - 1; $excel->removeSheetByIndex($index); // 刪除當前表單 $index = $excel->getIndex($excel->getActiveSheet()); $excel->removeSheetByIndex($index);
單元是承載內容的主體,其上操做比較複雜,大部分的類和API都與單元相關。單元隸屬於具體的表單,使用上和表單類互動最多。
經常使用操做的包括定位、取值/賦值、格式化等。下面是一些代碼示例:
// 獲取單元對象 $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的成員變量負責:
$property = $excel->getProperties(); $property->setCreator("tlanyan"); $property->setTitle("demo workbook"); $property->setKeywords("tlanyan, PHPExcel");
上述介紹了常見的概念和操做,實際中可能會用到的概念還包括:
這些冷門或高級功能能夠參照API文檔。
PHPExcel官方文檔可能稍有繁雜,網絡上的二手資料在深刻方面常有欠缺。要用好PHPExcel,一個基本功是搞清楚操做的對象,以及和其餘類/對象的關係(這也是面向對象編程的基本功)。本文中提到的PHPExcel->PHPExcel_WorkSheet->PHPExcel_Cell繼承體系,是使用過程當中操做最爲頻繁的對象,但願以上說明和示例能加深讀者對PHPExcel類庫的理解。