方案一:HTML 表格導出類 (支援樣式、多工作表模擬)
buildHtml($headers, $data);
}
private function buildHtml(array $headers, array $data): string {
$html = '';
$html .= '';
$html .= '';
$html .= '';
// 表頭
foreach ($headers as $h) {
$html .= "| {$h} | ";
}
$html .= '
';
// 數據行
foreach ($data as $row) {
$html .= '';
foreach ($row as $cell) {
// 長數字 (身份證/銀行卡) 強制文本格式
$style = (is_numeric($cell) && strlen($cell) >= 14)
? "style='vnd.ms-excel.numberformat:@;padding:4px'"
: "style='padding:4px'";
$html .= "| {$cell} | ";
}
$html .= '
';
}
$html .= '
';
return $html;
}
}
// 使用
$exporter = new ExcelExporter();
$exporter->export(
['編號', '姓名', '身份證'],
[
[1, '張三', '110101199001011234'],
[2, '李四', '110101199001011235'],
],
'用戶列表'
);
方案二:CSV 簡潔導出 (零依賴、大數據首選)
關鍵編碼與格式處理對比
| 場景 | HTML 表格法 | CSV 法 |
| 中文支援 | charset=UTF-8 + iconv 文件名 | UTF-8 BOM + 文件名編碼 |
| 長數字文本化 | `vnd.ms-excel.numberformat:@` | 前綴 `\t` 或 `="..."` |
| 樣式/合併儲存格 | 支援 (CSS/HTML) | 不支援 |
| 多工作表 | 不支援 (單文件) | 不支援 |
| 內存佔用 | 全量構建字符串 | 流式寫入,極低 |
| Excel 打開速度 | 較慢 (解析 HTML) | 極快 (原生格式) |
| 適用數據量 | < 5 萬行 | 無上限 |
進階:PhpSpreadsheet 專業導出 (推薦複雜報表)
composer require phpoffice/phpspreadsheet
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->fromArray($headers, null, 'A1');
$sheet->fromArray($data, null, 'A2');
// 列寬自適應
foreach ($sheet->getColumnDimensions() as $dim) {
$dim->setAutoSize(true);
}
// 導出
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
總結選型指南
- **簡單後台導出、<5萬行、需基本樣式** → HTML 表格類
- **大數據導出、定時任務、無樣式需求** → CSV 生成器流式導出
- **複雜報表、多 Sheet、條件格式、圖表、模板** → PhpSpreadsheet
- **現代前後端分離** → 後端提供 JSON,前端 SheetJS/xlsx.js 生成 .xlsx 下載
核心原則:**編碼統一 UTF-8、長數字強制文本、大數據流式處理、文件名編碼轉換**。掌握這四點,解決 95% 的 Excel 導出坑。