注意: PHPExcel 專案已於 2017 年正式停止維護,建議新專案使用其繼任者 PhpSpreadsheet。本文內容僅供維護舊專案參考。
// 載入核心類別(舊版自動載入方式)
require 'PHPExcel/Classes/PHPExcel.php';
require 'PHPExcel/Classes/PHPExcel/Writer/Excel5.php'; // Excel 97-2003 格式
// 讀取現有檔案
$objPHPExcel = \PHPExcel_IOFactory::load('a.xls');
// 指定活動工作表(索引從 0 開始)
$objPHPExcel->setActiveSheetIndex(0);
// 設定預設字型(解決中文顯示問題)
$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('微軟正黑體');
// 設定文件屬性
$objPHPExcel->getProperties()->setTitle('報表標題');
$sheet = $objPHPExcel->getActiveSheet();
// 設定儲存格數值
$sheet->setCellValue('A3', '測試內容');
// 設定儲存格樣式範例
$sheet->getStyle('A1:E1')->applyFromArray([
'font' => ['bold' => true, 'size' => 14, 'color' => ['rgb' => 'FFFFFF']],
'fill' => ['fillType' => \PHPExcel_Style_Fill::FILL_SOLID, 'startColor' => ['rgb' => '3498DB']],
'alignment' => ['horizontal' => \PHPExcel_Style_Alignment::HORIZONTAL_CENTER],
'borders' => ['allborders' => ['style' => \PHPExcel_Style_Border::BORDER_THIN]]
]);
$objDrawing = new \PHPExcel_Worksheet_Drawing();
$objDrawing->setPath('logo.png'); // 本地圖片路徑
$objDrawing->setCoordinates('A1'); // 定位儲存格
$objDrawing->setName('Logo');
$objDrawing->setDescription('公司標誌');
$objDrawing->setHeight(80); // 高度(像素),寬度自動等比縮放
$objDrawing->setOffsetX(5); // 水平偏移
$objDrawing->setOffsetY(5); // 垂直偏移
$objDrawing->setWorksheet($sheet); // 綁定工作表
// 若需支援遠端圖片,需修改原始碼:
// PHPExcel/Classes/PHPExcel/Worksheet/Drawing.php 第 106 行
// 將 file_exists 改為檢查 URL 並用 file_get_contents 讀取
$filename = '報表_' . date('Ymd_His') . '.xls';
$encoded_filename = rawurlencode($filename);
$ua = $_SERVER["HTTP_USER_AGENT"];
header('Content-Type: application/vnd.ms-excel');
header("Pragma: no-cache");
header("Expires: 0");
// IE / Edge
if (preg_match("/MSIE|Trident\/7.0|Edge/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
}
// Firefox
elseif (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
}
// Chrome / Safari / 其他
else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
$objWriter = new \PHPExcel_Writer_HTML($objPHPExcel);
$objWriter->save('php://output');
$filename = '報表_' . date('Ymd_His') . '.pdf';
$encoded_filename = rawurlencode($filename);
// 指定使用 mPDF 渲染器
$rendererName = \PHPExcel_Settings::PDF_RENDERER_MPDF;
// mPDF 類庫路徑(需先下載 mPDF 5.7 版本)
$rendererLibraryPath = 'PHPExcel/MPDF57';
if (!\PHPExcel_Settings::setPdfRenderer($rendererName, $rendererLibraryPath)) {
die('請確認 mPDF 路徑設定正確:' . $rendererLibraryPath);
}
header('Content-Type: application/pdf');
header("Pragma: no-cache");
header("Expires: 0");
// 同樣的跨瀏覽器檔名處理
$ua = $_SERVER["HTTP_USER_AGENT"];
if (preg_match("/MSIE|Trident\/7.0|Edge/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} elseif (preg_match("/Firefox/", $ua)) {
header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
$objWriter = new \PHPExcel_Writer_PDF($objPHPExcel);
$objWriter->setPreCalculateFormulas(false); // 避免公式計算導致錯誤
$objWriter->save('php://output');
exit;
解決方法: 修改 PHPExcel/Classes/PHPExcel/Writer/PDF/mPDF.php 約第 105 行,在 $pdf = new mPDF(...) 之後加入:
$pdf->useAdobeCJK = true; // 啟用 Adobe CJK 字型支援 $pdf->SetAutoFont(AUTOFONT_ALL); // 自動回退字型
並確認 mPDF 的 ttfonts 目錄下有中文字型檔(如 msjh.ttc 微軟正黑體),並在 config_fonts.php 中註冊。
現象: PHP 5.5+ 棄用、PHP 7.0+ 移除 /e 修飾符,mPDF 5.7 內部多處使用,導致白屏無錯誤訊息(需查 PHP error_log)。
解決方法: 將 mPDF 原始碼中所有 preg_replace(..., '/e', ...) 改寫為 preg_replace_callback(...)。主要檢案約 5-6 處,建議直接升級至 mPDF 6.x+ 或改用 PhpSpreadsheet + DomPDF/mPDF 7+。
修正位置: PHPExcel/Classes/PHPExcel/Writer/HTML.php 約第 1236 行
// 原始碼可能缺少判斷導致 Notice
if (!$this->_useInlineCss) {
$cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();
}
新專案請直接使用 PhpSpreadsheet,語法幾乎相容且持續維護:
composer require phpoffice/phpspreadsheet
PHPExcel 改為 PhpOffice\PhpSpreadsheetPHPExcel 曾是 PHP 操作 Excel 的標準方案,但已停止維護 6 年以上。維舊專案時需注意 mPDF 版本相容性與 PHP 版本限制;新專案務必採用 PhpSpreadsheet,避免安全性風險與相容性問題。