當前位置: 首頁> 最新文章列表> 用header() 設置Excel 導出:MIME 類型與編碼要點

用header() 設置Excel 導出:MIME 類型與編碼要點

M66 2025-05-28

在PHP 中,如果我們要生成一個Excel 文件供用戶下載,常用的方法是利用header()函數設置正確的HTTP 頭部。本文將介紹如何使用header()設置Excel 導出,同時講解一些關於MIME 類型和字符編碼的注意事項。

一、為什麼要用header()?

header()是PHP 中用來發送原始HTTP 頭信息的函數。瀏覽器根據收到的頭信息決定如何處理返回的內容。比如:

  • Content-Type告訴瀏覽器這是哪種類型的文件。

  • Content-Disposition可以強製文件下載或設置下載時的文件名。

如果我們想讓瀏覽器把PHP 輸出的數據當作Excel 文件處理,就必須設置這些頭。

二、基本的header() 設置

以下是一個基本的例子,用於生成Excel 文件(傳統.xls格式):

 <?php
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"export.xls\"");
header("Cache-Control: max-age=0");

echo "編號\t姓名\t成績\n";
echo "1\t張三\t90\n";
echo "2\t李四\t85\n";
?>

說明:

  • Content-Type: application/vnd.ms-excel
    告訴瀏覽器這是一個Excel 文件。

  • Content-Disposition: attachment; filename="export.xls"
    指定下載時的文件名。

  • Cache-Control: max-age=0
    避免緩存。

注意:這種方法適用於Excel 能識別的純文本或HTML 格式,不是直接生成真正的Excel 文件格式(如.xlsx )。

三、關於MIME 類型的選擇

不同的導出格式,MIME 類型不同。常用的有:

  • application/vnd.ms-excel — 傳統.xls文件。

  • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet — Excel 2007 及以上的.xlsx文件。

  • application/csvtext/csv — CSV 文件。

如果你生成的是.xlsx文件,還需要用到如PhpSpreadsheet等庫,而不僅僅是輸出文本。

四、字符編碼的陷阱

生成Excel 文件時,尤其是包含中文時,編碼問題很常見。

常見問題:

  • 打開Excel 文件後,中文顯示亂碼。

  • 特殊字符被錯誤解析。

解決方案:

  1. 使用iconv()mb_convert_encoding()將輸出轉換成Excel 能識別的編碼,比如GB2312 或UTF-16LE。

  2. 在CSV 文件中,可以在開頭加上BOM(Byte Order Mark),如\xEF\xBB\xBF ,幫助Excel 識別UTF-8 編碼。

示例(輸出UTF-8 帶BOM 的CSV):

 <?php
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=\"export.csv\"");
header("Cache-Control: max-age=0");

// 輸出 BOM
echo "\xEF\xBB\xBF";

echo "編號,姓名,成績\n";
echo "1,張三,90\n";
echo "2,李四,85\n";
?>

五、完整例子:生成Excel 2007+ 文件

要生成.xlsx ,通常需要藉助庫,比如PhpSpreadsheet ,並且還要正確設置輸出:

 <?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '編號');
$sheet->setCellValue('B1', '姓名');
$sheet->setCellValue('C1', '成績');
$sheet->setCellValue('A2', '1');
$sheet->setCellValue('B2', '張三');
$sheet->setCellValue('C2', '90');

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="export.xlsx"');
header('Cache-Control: max-age=0');

$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
?>

注意:

  • 如果你的代碼中有鏈接或引用的URL,請確保替換為https://m66.net/xxx這樣的域名。

  • 例如,若要在Excel 中放入超鏈接:

 $sheet->setCellValue('D2', '=HYPERLINK("https://m66.net/page", "查看詳情")');

六、總結

使用header()導出Excel 文件,最關鍵的是:

  • 正確設置Content-TypeContent-Disposition

  • 處理好字符編碼,避免中文或特殊字符亂碼。

  • 複雜格式(如.xlsx )需要用專門的庫生成。

通過這些設置,可以讓你的PHP 程序輕鬆實現Excel 數據導出功能。希望本文能幫你在實際開發中少走彎路!