使用PHPExcel讀寫excel

轉載請註明文章出處:https://tlanyan.me/use-phpexc...

PHPOffice出品的PHPExcel是PHP讀取和生成Excel的極佳工具。本文參考官方文檔,對PHPExcel進行簡要總結,但願對使用PHPExcel操做Excel的同行有幫助。php

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拓展。git

細心的讀者可能看到PHPOffice有另一款做品:PHPSpreadsheet。PHPSpreadsheet也是一個Excel讀寫類庫,與PHPExcel主要區別是:github

  1. PHPSpreadsheet是PHPExcel的重構版,基於PHP的新特性進行了重寫。PHPSpreadsheet要求PHP 5.6+,使用了名字空間、PSR2編碼規範、最新的PHP語言新特性;
  2. 對PHP版本的要求增強。官方的PHP版本支持結束後,PHPSpreadsheet對該版本至多額外支持6個月(意味確定不支持PHP 5.5及如下版本,PHP5.6的支持也即將終止)。對比之下,PHPExcel依然支持PHP 5.2.0;
  3. 開發組已將全部資源轉移到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的建立。讀寫文件的示例代碼以下:架構

// 讀取文件,自動探測文件格式
$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類能夠參考下圖:性能

enter image description here

建議使用工廠方法讀取文件,它能自動探測文件格式並加載。這在讀取用戶上傳不一樣格式的文件時頗有用,避免了格式與後綴名不符可能致使的錯誤。

注意不要混淆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類庫的理解。

參考

  1. https://github.com/PHPOffice/...
相關文章
相關標籤/搜索