在 PHP 開發中,匯出或修改 Excel 報表是常見需求。PHPExcel(現已併入 PhpSpreadsheet)是處理 Excel 檔案的經典函式庫。本文提供一個完整、可直接執行的範例,示範如何載入模板、修改儲存格內容,並以檔案下載方式輸出。
<?php
// 模板檔案存放目錄
$dir = $_SERVER['DOCUMENT_ROOT'] . '/backoffice/admin/oemcheck/';
$templateName = '1.xlsx'; // 來源模板檔名
$outputFileName = '模板.xlsx'; // 下載時的檔名
$txt = 'test'; // 要寫入的文字
// 1. 實例化讀取器,自動偵測 Excel 2007 (xlsx) 或 Excel 5 (xls)
$PHPReader = new PHPExcel_Reader_Excel2007();
if (!$PHPReader->canRead($dir . $templateName)) {
$PHPReader = new PHPExcel_Reader_Excel5();
if (!$PHPReader->canRead($dir . $templateName)) {
die('無法識別的 Excel 文件!');
}
}
// 2. 載入 Excel 檔案
$PHPExcel = $PHPReader->load($dir . $templateName);
// 3. 取得第一個工作表(索引 0)
$currentSheet = $PHPExcel->getSheet(0);
// 4. 寫入資料到 B13 儲存格(注意編碼轉換)
$currentSheet->setCellValue('B13', iconv('gbk', 'utf-8', $txt));
// 5. 實例化寫入器並輸出至瀏覽器下載
$PHPWriter = new PHPExcel_Writer_Excel2007($PHPExcel);
ob_start();
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $outputFileName . '"');
header('Cache-Control: max-age=0');
$PHPWriter->save('php://output');
exit;
程式先嘗試用 Excel2007 讀取 .xlsx,失敗則改用 Excel5 讀取 .xls,確保舊版檔案也能處理。
setCellValue('B13', ...) 指定座標寫入。範例中使用 iconv('gbk','utf-8',$txt) 處理編碼轉換,若您的專案已全面採用 UTF-8,可直接傳入字串。
Content-Type:明確指定 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,比泛用的 octet-stream 更精確。Content-Disposition: attachment:強制瀏覽器彈出下載視窗。save('php://output'):直接輸出到標準輸出流,不佔用伺服器磁碟空間。| 問題 | 解決方案 |
|---|---|
| 記憶體不足 | 大檔案建議改用 PhpSpreadsheet 的 ChunkReadFilter 分塊讀取,或增加 memory_limit。 |
| 中文檔名下載亂碼 | 依 RFC 5987 格式寫 Header:header('Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($outputFileName)); |
| 樣式保留 | 模板的字型、欄寬、合併儲存格等樣式會自動保留;若需動態調整樣式,可使用 $currentSheet->getStyle('B13')->applyFromArray([...])。 |
官方建議遷移至 PhpSpreadsheet,API 高度相容,只需將命名空間從 PHPExcel_* 改為 PhpOffice\PhpSpreadsheet\*,並透過 Composer 安裝:
composer require phpoffice/phpspreadsheet
掌握「載入模板 → 修改資料 → 串流輸出」這三步驟,即可滿足大多數 Excel 匯出需求。建議新專案直接採用 PhpSpreadsheet,獲得更好的效能與長期支援。