首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHPExcel 核心操作筆記與 mPDF 導出 PDF 完整指南

     編輯:PHP 相關知識

PHPExcel 核心操作筆記與 mPDF 導出 PDF 完整指南

注意: PHPExcel 專案已於 2017 年正式停止維護,建議新專案使用其繼任者 PhpSpreadsheet。本文內容僅供維護舊專案參考。

一、PHPExcel 基礎操作速查

1. 類庫引入與初始化

// 載入核心類別(舊版自動載入方式)
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('報表標題');

2. 儲存格數值與樣式操作

$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]]
]);

3. 圖片插入與調整

$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 讀取

4. 瀏覽器下載匯出(支援跨瀏覽器檔名編碼)

$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;

5. HTML 除錯輸出

$objWriter = new \PHPExcel_Writer_HTML($objPHPExcel);
$objWriter->save('php://output');

二、整合 mPDF 導出 PDF(含中文亂碼解決方案)

1. 基本導出流程

$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;

2. 常見問題與解決方案

問題一:PDF 中文顯示亂碼或缺字

解決方法: 修改 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 中註冊。

問題二:preg_replace /e 修飾符棄用導致錯誤

現象: 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+。

問題三:HTML 輸出器單元格樣式判斷錯誤

修正位置: PHPExcel/Classes/PHPExcel/Writer/HTML.php 約第 1236 行

// 原始碼可能缺少判斷導致 Notice
if (!$this->_useInlineCss) {
    $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex();
}

三、遷移建議:升級至 PhpSpreadsheet

新專案請直接使用 PhpSpreadsheet,語法幾乎相容且持續維護:

composer require phpoffice/phpspreadsheet
  • 命名空間從 PHPExcel 改為 PhpOffice\PhpSpreadsheet
  • 支援 PHP 7.1+、嚴格型別、PSR-4 自動載入
  • 內建支援 XLSX、ODS、CSV、HTML、PDF (via DomPDF/mPDF)
  • 效能優化、記憶體管理改善

總結

PHPExcel 曾是 PHP 操作 Excel 的標準方案,但已停止維護 6 年以上。維舊專案時需注意 mPDF 版本相容性與 PHP 版本限制;新專案務必採用 PhpSpreadsheet,避免安全性風險與相容性問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved