PHP导出中文Excel文件:两种经典方法与注意事项

Owen
Owen
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍了在PHP中导出数据为Excel表格的两种常见实现方式:一种是通过构建符合微软Office标准的HTML模板来生成.xls文件,另一种则是利用制表符分隔的纯文本格式模拟CSV输出。这两种方法均涉及HTTP响应头的正确设置以及关键的字符编码处理,以解决中文内容在导出时出现的乱码问题。

核心思路与结果

要将数据库或数组中的中文数据导出为Excel可打开的文件,核心在于两点:

  1. 正确的Content-Type:告知浏览器下载的是电子表格文件(通常为 application/vnd.ms-excel 或 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)。
  2. 正确的字符编码:早期版本的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导出的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表