Web 端匯出 Excel 時,常遇到兩大痛點:
本質上,瀏覽器接收到 Content-Type: application/vnd.ms-excel 後,會啟動 Excel 解析 HTML 表格。若儲存格未指定格式,Excel 會依預設格式渲染——數字型欄位即會觸發科學計數法。解決關鍵在於:為儲存格明確指定「文字」格式,並正確宣告字元編碼。
透過 CSS 樣式 vnd.ms-excel.numberformat:@ 即可將儲存格設為文字格式。其他常用格式:
| 格式類型 | 樣式語法 | 範例 |
|---|---|---|
| 文字 | vnd.ms-excel.numberformat:@ | 身分證、手機號 |
| 日期 | vnd.ms-excel.numberformat:yyyy/mm/dd | 2024/01/15 |
| 數字(千分位) | vnd.ms-excel.numberformat:#,##0.00 | 1,234.56 |
| 貨幣 | vnd.ms-excel.numberformat:¥#,##0.00 | ¥1,234.56 |
| 百分比 | vnd.ms-excel.numberformat:#0.00% | 12.34% |
樣式可套用至 <td>、<div>、<tr>、<table> 等標籤。優先級遵循「就近原則」:離資料最近的樣式生效。 因此,對關鍵欄位(如身分證)直接在 <td> 設定文字格式最保險。
<?php
// 1. 設定檔名並解決中文檔名亂碼
$filename = iconv("UTF-8", "GB2312//IGNORE", "會員名.xls");
// 2. 輸出 HTTP 標頭
header("Content-type: application/vnd.ms-excel");
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=" . $filename);
header("Pragma: no-cache");
header("Expires: 0");
// 3. 輸出 Excel 專用 HTML 結構(含 XML 命名空間)
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="https://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="expires" content="Mon, 06 Jan 1999 00:00:01 GMT">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>工作表1</x:Name>
<x:WorksheetOptions>
<x:DisplayGridlines/>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml><![endif]-->
</head>';
// 4. 輸出表格標題列
echo "<table><tr>
<th>" . iconv("UTF-8", "GB2312//IGNORE", "會員名") . "</th>
<th>" . iconv("UTF-8", "GB2312//IGNORE", "帳號") . "</th>
<th>" . iconv("UTF-8", "GB2312//IGNORE", "聯絡人") . "</th>
</tr>";
// 5. 迴圈輸出資料列,關鍵欄位加上文字格式樣式
foreach ($list as $v) {
echo "<tr>";
echo "<td>" . iconv("UTF-8", "GB2312//IGNORE", $v["user_name"]) . "</td>";
// 身分證/帳號欄位:強制文字格式
echo "<td style='vnd.ms-excel.numberformat:@'>" . $v["account_id"] . "</td>";
echo "<td>" . iconv("UTF-8", "GB2312//IGNORE", $v["contact_name"]) . "</td>";
echo "</tr>";
}
echo "</table>";
?>
iconv("UTF-8", "GB2312//IGNORE", ...) 確保中文正確顯示。<td style='vnd.ms-excel.numberformat:@'> 徹底解決科學計數法。xmlns:x="urn:schemas-microsoft-com:office:excel" 啟用 Excel 專屬渲染模式。<!--[if gte mso 9]> 確保舊版 IE/Excel 正確解析。此方案無需第三方庫(如 PHPExcel/PhpSpreadsheet),輕量、零依賴,適合簡單匯出場景。若需支援 .xlsx、樣式豐富、大數據量,建議改用 PhpSpreadsheet。