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

PHP 讀取與導出 Excel 實戰:基於 PHPExcel 的完整示例

     編輯:PHP 相關知識

在報表導出、數據導入等業務中,Excel 處理是高頻需求。本文基於經典庫 PHPExcel(現已併入 PhpSpreadsheet,建議新項目直接使用後者),演示從模板讀取、數據填充、到瀏覽器下載的完整流程。

核心代碼實現

<?php
require_once 'vendor/autoload.php'; // Composer 自動加載

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$templateDir = __DIR__ . '/templates/';
$templateName = '1.xlsx';
$outputFileName = '導出報表_' . date('Ymd_His') . '.xlsx';
$fillData = '測試數據'; // 實際業務中來自數據庫查詢等

// 1. 自動識別並讀取模板(支援 .xls / .xlsx)
$reader = IOFactory::createReaderForFile($templateDir . $templateName);
$spreadsheet = $reader->load($templateDir . $templateName);

// 2. 獲取第一個工作表並寫入數據
$sheet = $spreadsheet->getActiveSheet();
// 示例:向 B13 單元格寫入數據(注意編碼轉換視模板而定)
$sheet->setCellValue('B13', $fillData);

// 更多寫入示例
// $sheet->setCellValue('A1', '標題');
// $sheet->fromArray($dataArray, null, 'A2'); // 批量寫入陣列

// 3. 設置下載響應頭
$writer = new Xlsx($spreadsheet);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . urlencode($outputFileName) . '"');
header('Cache-Control: max-age=0');
header('Expires: 0');

// 4. 直接輸出到瀏覽器
$writer->save('php://output');
exit;
?>

關鍵點詳解

  1. 自動識別格式:IOFactory::createReaderForFile() 會根據文件內容自動判斷是 Xls 還是 Xlsx,無需手動切換 Reader。
  2. 模板複用:預先設計好格式、樣式、公式的模板文件,代碼僅負責填充動態數據,極大降低維護成本。
  3. 編碼處理:PhpSpreadsheet 內部使用 UTF-8,若模板來源包含 GBK 字符,需在寫入前 mb_convert_encoding($str, 'UTF-8', 'GBK')。
  4. 大文件優化:導出超過 5 萬行時,建議啟用 $writer->setPreCalculateFormulas(false)、使用 ChunkReadFilter 分塊讀寫,或改用 CSV/流式輸出。
  5. 內存管理:操作完成後可調用 $spreadsheet->disconnectWorksheets() 釋放循環引用,配合 unset($spreadsheet) 及時回收內存。

遷移提示:從 PHPExcel 到 PhpSpreadsheet

  • 命名空間:PHPExcel_* → PhpOffice\PhpSpreadsheet\*
  • 安裝:composer require phpoffice/phpspreadsheet
  • API 大體兼容,但部分方法簽名調整(如 getActiveSheet() 替代 getSheet(0))。
新項目請直接使用 PhpSpreadsheet,PHPExcel 已停止維護且存在已知安全漏洞(CVE-2018-19277 等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved