PHP导出中文Excel文件:两种经典方法与注意事项
本文介绍了在PHP中导出数据为Excel表格的两种常见实现方式:一种是通过构建符合微软Office标准的HTML模板来生成.xls文件,另一种则是利用制表符分隔的纯文本格式模拟CSV输出。这两种方法均涉及HTTP响应头的正确设置以及关键的字符编码处理,以解决中文内容在导出时出现的乱码问题。
核心思路与结果
要将数据库或数组中的中文数据导出为Excel可打开的文件,核心在于两点:
- 正确的Content-Type:告知浏览器下载的是电子表格文件(通常为
application/vnd.ms-excel或application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)。 - 正确的字符编码:早期版本的Excel对UTF-8支持有限,通常需要将UTF-8编码的中文转换为GB2312或GBK编码,或在文件中嵌入元数据声明UTF-8。
准备条件
在执行以下代码前,请确保:
- 运行环境支持PHP及相应的HTTP头部发送功能。
- 已准备好待导出的数据源(通常是关联数组或多维数组)。
- 明确目标用户使用的Excel版本,旧版(.xls)与新版(.xlsx/UTF-8)的处理方式略有不同。
真实操作顺序
第1步:使用HTML表格法生成.xls文件
这种方法通过将HTML表格标记伪装成Excel文件格式,能够保留基本的样式(如背景色、字体加粗)。这是兼容最广泛的方法之一。
目的
生成带有基本样式且能直接由Excel打开的.xls文件,正确处理中文显示。
入口与动作
创建一个类 toExcel,其核心方法接收映射关系(表头)、数据列表和文件名作为参数。
<?php
class toExcel{
public $link = null;
function __construct(){ }
public function toExcel($mapping,$datalist,$fileName) {
// 1. 设置响应头,强制下载
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=".iconv('utf-8', 'gb2312', $fileName).".xls");
// 2. 输出HTML头部,包含XML命名空间以便Excel识别
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://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=UTF-8">
<!--[if gte mso 9]><xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name></x:Name>
<x:WorksheetOptions>
<x:DisplayGridlines/>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml><![endif]-->
</head>
<body link=blue vlink=purple leftmargin=0 topmargin=0>';
// 3. 开始输出表格
echo '<table border="0" cellspacing="0" cellpadding="0">';
echo '<tr>';
if(is_array($mapping)) {
foreach($mapping as $key=>$val)
// 注意:此处假设$val已是中文,若需GB2312编码需在header处理
echo "<td style='background-color:#09F;font-weight:bold;'>".$val."</td>";
}
echo '</tr>';
// 4. 遍历数据并填充行
foreach($datalist as $k=>$v){
echo '<tr>';
foreach($v as $key=>$val){
// 特殊处理:长数字(如身份证)转为字符串防止科学计数法
if(is_numeric($val) && strlen($val)>=14){
echo "<td style='vnd.ms-excel.numberformat:@'>".$val."</td>";
}else{
echo "<td>".$val."</td>";
}
}
echo '</tr>';
}
echo '</table>';
echo '</body>';
echo '</html>';
}
}
// 使用示例
$map=array('No','Name','Email');
$datal=array(array(1, '管理员', 'admin@163.com'), array(2, 'member', 'member@163.com'));;
$csv=new toExcel;
$csv->toExcel($map,$datal,"dataexport");
?>
重要参数说明
iconv('utf-8', 'gb2312', $fileName):确保生成的文件名中文不乱码。vnd.ms-excel.numberformat:@:用于强制将长数字以文本形式存储,避免精度丢失。
第2步:使用制表符分隔的纯文本法(轻量级方案)
此方法更为简单,通过输出以Tab键(\t)分隔的文本,并以新行符(\r\n 或 \n)结束行,保存为.csv或.xls后缀。Excel能自动解析这种格式。
目的
快速导出纯文本数据,无需复杂HTML结构,适合对样式无要求的场景。
入口与动作
直接输出Header并循环打印数据和Tab分隔符。
<?php
// 设置头信息,注意这里使用了 .execl 可能是笔误,标准应为 .xls 或 .csv
header("Content-Type: application/vnd.ms-excelexcel");
header("Content-Disposition: attachment; filename=myExcel.xls");
header("Pragma: no-cache");
header("Expires: 0");
/*第一行数据*/
$data1= "中文测试";
// 关键步骤:将UTF-8编码转换为GB2312,否则Excel打开可能乱码
data1=mb_convert_encoding($data1,"GB2312","UTF-8");
echo $data1."\t";
echo "world"."\t";
echo "\t\n";
/*第二行数据*/
echo "this is second line"."\t";
echo "Hi,pretty girl"."\t";
echo "\t\n";
?>
完成判断
执行脚本后,浏览器将触发下载一个名为 myExcel.xls 的文件。用Excel打开该文件,应能看到分列显示的中文和英文内容。如果中文显示为问号或乱码,请检查 mb_convert_encoding 的目标编码是否为 GB2312 或 GBK,因为旧版Excel默认使用ANSI编码读取这类文件。
原文有依据的排错
- 编码问题:如果在生成的Excel中看到中文乱码,通常是因为服务器输出的是UTF-8,而Excel客户端尝试用GBK/GB2312解码。解决方法是使用
iconv或mb_convert_encoding将内容转为GB2312。 - 数字精度丢失:超过10位的数字(如订单号、身份证号)在Excel中会自动变为科学计数法。在HTML表中需添加样式
vnd.ms-excel.numberformat:@,在CSV/TAB方法中可在数字前加单引号'123456789012强制文本化。 - 文件扩展名错误:在第二种方法草稿中出现了
.execl,这是一个明显的拼写错误,实际文件名应设为.xls或.csv。
简要总结
以上两种方法是PHP导出数据的经典实践。第一种HTML表格法灵活性高,可定制样式;第二种TAB分隔法代码极简,适合快速交付。在实际生产环境中,对于大量数据或复杂格式需求,建议考虑使用 PHPExcel 或其继任者 PhpSpreadsheet 等第三方库,以获得更好的性能和兼容性支持。
以上就是PHP导出中文Excel文件类实例的详细内容,更多关于PHP Excel导出的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













