萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 匯出 Excel 簡易方案:CSV/HTML 表格與標準庫對比

前言

PHP 匯出 Excel 有多種路徑:原生 HTTP 標頭輸出 HTML 表格 (偽 Excel)、CSV 格式、專業庫。本文對比三種方案優劣,提供可直接使用的程式碼範例。

方案一:HTTP 標頭 + HTML 表格 (最簡單、相容性佳)

瀏覽器識別 Content-Type: application/vnd.ms-excel 會啟動 Excel 開啟 HTML 表格。


用戶名郵箱註冊時間
Tomtom@example.com2024-01-15
Jerryjerry@example.com2024-01-16

優點:零依賴、支援樣式 (CSS)、合併儲存格、公式。
缺點:非真正二進制格式、大檔案記憶體壓力大、Excel 會彈出格式不符警告。

方案二:CSV 格式 (標準、通用、效能最佳)

優點:串流輸出、記憶體常數級、所有試算表軟體支援、可直接匯入資料庫。
缺點:無樣式、無多工作表、無公式。

方案三:專業庫 (PhpSpreadsheet - 現代標準)

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 串流模式)、依賴較重。

方案四:Word 文件匯出 (同理)





報表標題

內容段落...

項目數值

編碼問題完整解決方案

格式編碼處理關鍵點
HTML/Excelheader charset=utf-8 + 內容 UTF-8Excel 2016+ 完美支援
CSVUTF-8 BOM (EF BB BF) + fputcsvExcel 雙擊直接開啟不亂碼
XlsxPhpSpreadsheet 內部 UTF-8無需額外處理

大數據量優化策略

  1. 分批查詢:LIMIT 1000 OFFSET ... 迴圈寫入
  2. 串流寫入:PhpSpreadsheet createWriter() + save('php://output')
  3. 關閉記憶體緩衝:$spreadsheet->setPreCalculateFormulas(false)
  4. 使用生成器: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 格式的相容性問題。

copyright © 萬盛學電腦網 all rights reserved