在PHP 中,如果我們要生成一個Excel 文件供用戶下載,常用的方法是利用header()函數設置正確的HTTP 頭部。本文將介紹如何使用header()設置Excel 導出,同時講解一些關於MIME 類型和字符編碼的注意事項。
header()是PHP 中用來發送原始HTTP 頭信息的函數。瀏覽器根據收到的頭信息決定如何處理返回的內容。比如:
Content-Type告訴瀏覽器這是哪種類型的文件。
Content-Disposition可以強製文件下載或設置下載時的文件名。
如果我們想讓瀏覽器把PHP 輸出的數據當作Excel 文件處理,就必須設置這些頭。
以下是一個基本的例子,用於生成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 類型不同。常用的有:
application/vnd.ms-excel — 傳統.xls文件。
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet — Excel 2007 及以上的.xlsx文件。
application/csv或text/csv — CSV 文件。
如果你生成的是.xlsx文件,還需要用到如PhpSpreadsheet等庫,而不僅僅是輸出文本。
生成Excel 文件時,尤其是包含中文時,編碼問題很常見。
常見問題:
打開Excel 文件後,中文顯示亂碼。
特殊字符被錯誤解析。
解決方案:
使用iconv()或mb_convert_encoding()將輸出轉換成Excel 能識別的編碼,比如GB2312 或UTF-16LE。
在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";
?>
要生成.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-Type和Content-Disposition 。
處理好字符編碼,避免中文或特殊字符亂碼。
複雜格式(如.xlsx )需要用專門的庫生成。
通過這些設置,可以讓你的PHP 程序輕鬆實現Excel 數據導出功能。希望本文能幫你在實際開發中少走彎路!