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

PHP 匯出 Excel 完整解決方案:科學計數法與中文亂碼雙重破解

     編輯:PHP 綜合知識

核心問題與解決思路

Web 端匯出 Excel 時,常遇到兩大痛點:

  1. 長數字(身分證、銀行卡號)自動轉科學計數法
  2. 中文內容顯示亂碼

本質上,瀏覽器接收到 Content-Type: application/vnd.ms-excel 後,會啟動 Excel 解析 HTML 表格。若儲存格未指定格式,Excel 會依預設格式渲染——數字型欄位即會觸發科學計數法。解決關鍵在於:為儲存格明確指定「文字」格式,並正確宣告字元編碼。

Excel 支援的常用儲存格格式

透過 CSS 樣式 vnd.ms-excel.numberformat:@ 即可將儲存格設為文字格式。其他常用格式:

格式類型樣式語法範例
文字vnd.ms-excel.numberformat:@身分證、手機號
日期vnd.ms-excel.numberformat:yyyy/mm/dd2024/01/15
數字(千分位)vnd.ms-excel.numberformat:#,##0.001,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:@'> 徹底解決科學計數法。
  • XML 命名空間:xmlns:x="urn:schemas-microsoft-com:office:excel" 啟用 Excel 專屬渲染模式。
  • 瀏覽器相容:<!--[if gte mso 9]> 確保舊版 IE/Excel 正確解析。

此方案無需第三方庫(如 PHPExcel/PhpSpreadsheet),輕量、零依賴,適合簡單匯出場景。若需支援 .xlsx、樣式豐富、大數據量,建議改用 PhpSpreadsheet。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved