使用PHPExcel讀寫excel檔案

NO IMAGE

轉載請註明文章出處: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的建立。讀寫檔案的示例程式碼如下:

<pre class="lang:php">// 讀取檔案,自動探測檔案格式
$excel = PHPExcel_IOFactory::load("./foo.xlsx");

// 新建excel檔案,儲存為Excel 2007格式
$excel2 = new PHPExcel();
$writer = PHPExcel_IOFactory::createWriter($excel2, "Excel2007");
$writer->save("./foo2.xlsx");
</pre>

如果知道具體格式,可以使用具體的類操作:

<pre class="lang:php">// 讀檔案
$reader = PHPExcel_Reader_Excel2007();
$excel = $reader->load("./foo1.xlsx");

// 寫檔案
$writer = PHPExcel_Writer_Excel2007($excel);
$writer->save("./foo2.xlsx");
</pre>

可用的reader和writer類可以參考下圖:

enter image description here

建議使用工廠方法讀取檔案,它能自動探測檔案格式並載入。這在讀取使用者上傳不同格式的檔案時很有用,避免了格式與字尾名不符可能導致的錯誤。

注意不要混淆PHPExcel和writer/reader物件:PHPExcel持有資料,writer和reader是對其進行序列化和反序列化的輔助類。

表單操作

一個excel檔案可以包含多個表單,常用操作包括讀取、新建、複製和刪除表單。表單從屬於excel檔案,一般需要掛載到具體的PHPExcel物件上。

獲取表單的方式有多種,如獲取當前表單、獲取指定順序表單、根據名字獲取表單。以下是示例程式碼:

<pre class="lang:php">$sheet = $excel->getActiveSheet();
// 獲取第二個表單,編號從0開始
$sheet = $excel->getSheet(1);
$sheet = $excel->getSheetByName("Worksheet 1");
</pre>

建立表單分為直接excel檔案物件直接建立,也可以先建立表單例項,後續再關聯。對應方法為:

<pre class="lang:php">$excel->createSheet();

$sheet = new PHPExcel_Worksheet($excel, "sheet 1");
// 一些其他操作
// 作為第二個表單插入到文件中
$excel->addSheet($sheet, 1);
</pre>

PHPExcel也支援複製表單(包括複製其他PHPExcel物件中的表單):

<pre class="lang:php">// 複製表單
$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);
</pre>

單元操作

單元是承載內容的主體,其上操作比較複雜,大部分的類和API都與單元相關。單元隸屬於具體的表單,使用上和表單類互動最多。

常用操作的包括定位、取值/賦值、格式化等。下面是一些程式碼示例:

<pre class="lang:php">// 獲取單元物件
$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);
</pre>

檔案屬性

設定excel檔案的屬性,包括常見的作者、標題、建立時間、描述等。該功能由PHPExcel中型別為DocumentProperties的成員變數負責:

<pre class="lang:php">$property = $excel->getProperties();
$property->setCreator("tlanyan");
$property->setTitle("demo workbook");
$property->setKeywords("tlanyan, PHPExcel");
</pre>

其他

上述介紹了常見的概念和操作,實際中可能會用到的概念還包括:

快取和效能
影象、圖表、超連結等富文字
日期、貨幣等格式化和本地化
公式設定
列印屬性設定
內容對其、邊距設定等
檔案密碼安全設定

這些冷門或高階功能可以參照API文件。

PHPExcel官方文件可能稍有繁雜,網路上的二手資料在深入方面常有欠缺。要用好PHPExcel,一個基本功是搞清楚操作的物件,以及和其他類/物件的關係(這也是物件導向程式設計的基本功)。本文中提到的PHPExcel->PHPExcel_WorkSheet->PHPExcel_Cell繼承體系,是使用過程中操作最為頻繁的物件,希望以上說明和示例能加深讀者對PHPExcel類庫的理解。

參考

https://github.com/PHPOffice/PHPExcel


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}