PHP 匯出 Excel 有多種路徑:原生 HTTP 標頭輸出 HTML 表格 (偽 Excel)、CSV 格式、專業庫。本文對比三種方案優劣,提供可直接使用的程式碼範例。
瀏覽器識別 Content-Type: application/vnd.ms-excel 會啟動 Excel 開啟 HTML 表格。
用戶名 郵箱 註冊時間
Tom tom@example.com 2024-01-15
Jerry jerry@example.com 2024-01-16
優點:零依賴、支援樣式 (CSS)、合併儲存格、公式。
缺點:非真正二進制格式、大檔案記憶體壓力大、Excel 會彈出格式不符警告。
優點:串流輸出、記憶體常數級、所有試算表軟體支援、可直接匯入資料庫。
缺點:無樣式、無多工作表、無公式。
composer require phpoffice/phpspreadsheet
getActiveSheet();
// 樣式
$sheet->getStyle('A1:C1')->getFont()->setBold(true);
$sheet->getColumnDimension('A')->setWidth(20);
$sheet->getColumnDimension('B')->setWidth(30);
// 資料
$sheet->setCellValue('A1', '用戶名');
$sheet->setCellValue('B1', '郵箱');
$sheet->setCellValue('C1', '註冊時間');
$users = [
['Tom', 'tom@example.com', '2024-01-15'],
['Jerry', 'jerry@example.com', '2024-01-16'],
];
$sheet->fromArray($users, null, 'A2');
// 輸出
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="users.xlsx"');
$writer->save('php://output');
優點:真正 .xlsx、完整樣式/圖表/公式/多工作表、大檔案支援串流寫入。
缺點:記憶體佔用大 (大數據建議用 PhpSpreadsheet\Writer\Xlsx 串流模式)、依賴較重。
報表標題
內容段落...
項目 數值
| 格式 | 編碼處理 | 關鍵點 |
|---|---|---|
| HTML/Excel | header charset=utf-8 + 內容 UTF-8 | Excel 2016+ 完美支援 |
| CSV | UTF-8 BOM (EF BB BF) + fputcsv | Excel 雙擊直接開啟不亂碼 |
| Xlsx | PhpSpreadsheet 內部 UTF-8 | 無需額外處理 |
LIMIT 1000 OFFSET ... 迴圈寫入createWriter() + save('php://output')$spreadsheet->setPreCalculateFormulas(false)yield 逐行輸出 CSV// CSV 生成器模式 (常數記憶體)
function exportUsersCsv(PDO $pdo): Generator {
$stmt = $pdo->query("SELECT name, email, created_at FROM users");
yield ['用戶名', '郵箱', '註冊時間'];
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
yield $row;
}
}
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="users.csv"');
$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
foreach (exportUsersCsv($pdo) as $row) {
fputcsv($out, $row);
}
fclose($out);
需要樣式/公式/多工作表?
├─ 是 → PhpSpreadsheet (.xlsx)
└─ 否 → 資料量 > 10萬行?
├─ 是 → CSV 生成器模式 (串流)
└─ 否 → CSV 或 HTML 表格
簡單報表用 HTML 表格或 CSV 即可,零依賴、效能佳。正式報表、複雜樣式、大數據量請使用 PhpSpreadsheet。永遠記得 CSV 加上 UTF-8 BOM 確保 Excel 正確開啟。現代專案建議直接標準化於 .xlsx (PhpSpreadsheet) 或 .csv (串流),避免偽 Excel 格式的相容性問題。