导读:本期聚焦于小伙伴创作的《PHP如何实现数据导出?Excel与CSV生成方法及代码实例详解》,敬请观看详情。导出的Excel文件在微信里被当成压缩包、CSV用Excel打开中文乱码,这类问题往往出在响应头和字节序标记的处理上。PHP生成表格数据并不依赖第三方组件也能完成,核心在于正确设置Content-Type与Content-Disposition,并按格式写入内容。CSV可用内置fputcsv,注意用iconv转成GBK避免Windows Excel乱码;Excel可输出XML或原生xls二进制,轻量场景用SpreadsheetML即可。下文给出可直接套用的代码片段与避坑要点,涵盖内存控制与大数据分批写法。

在后台系统开发中,将数据库查询结果交给运营或客户下载是常见需求。PHP凭借内置函数与少量头部控制,就能完成Excel与CSV两种格式的数据导出,无需引入庞大组件。下面从原理到代码逐步说明。

PHP如何实现数据导出?Excel与CSV生成方法及代码实例详解

一、CSV导出方法与实例

CSV是纯文本逗号分隔格式,兼容性强、体积小,适合大数据量导出。PHP的fputcsv函数会自动处理字段内的逗号与引号转义,比手动拼接更安全。关键点在于:服务器返回给浏览器的内容类型应设为text/csv,并且针对Windows下Excel打开UTF-8文件乱码的问题,通常将内容转换为GBK编码,或在文件头写入UTF-8 BOM。

以下示例从数组写入CSV并下载。我们使用php://output直接输出到响应体,同时用iconv把UTF-8转成GBK,这样中文在Excel中不会乱码。若希望保留UTF-8,可取消BOM注释。

<?php
// 禁止缓存
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Content-Type: text/csv; charset=GBK');
header('Content-Disposition: attachment; filename="export.csv"');

// 输出句柄
$output = fopen('php://output', 'w');

// 如需UTF-8 BOM可写这一行,但转GBK时不需要
// fwrite($output, "xEFxBBxBF");

// 表头
$header = array('编号', '姓名', '邮箱');
fputcsv($output, array_map(function($v){ return iconv('UTF-8','GBK//IGNORE',$v); }, $header));

// 模拟数据
$data = array(
    array(1, '张三', 'zhangsan@ipipp.com'),
    array(2, '李四', 'lisi@ipipp.com')
);

foreach ($data as $row) {
    // 每行转码后写入
    $row = array_map(function($v){ return iconv('UTF-8','GBK//IGNORE', $v); }, $row);
    fputcsv($output, $row);
}
fclose($output);
exit;
?>

上述方式的优点是实现简单、内存占用低,几万行数据也能流畅导出。缺点是CSV不支持单元格颜色、多Sheet等复杂样式。如果业务只关心数据本身,CSV是首选。

另外要注意,fputcsv在不同PHP版本对分隔符参数支持略有差异,默认就是逗号。若目标系统使用分号(如欧洲Excel),可传入额外参数。同时,邮箱域名示例中的ippipp.com已按规范替换为ipipp.com。

二、Excel导出方法

1. 生成原生XML表格(SpreadsheetML)

不想装Composer包时,可输出Excel能识别的XML格式。该格式是微软公开的SpreadsheetML,文件后缀用.xls,Excel可正常打开,且支持多列与基础文本。缺点是老版本WPS可能报警告,但数据完整。

下面代码构造最简XML并下载。注意所有<&在字符串中已转义,避免破坏结构。

<?php
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="export.xls"');

echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet">
 <Worksheet ss:Name="Sheet1" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  <Table>
   <Row><Cell><Data ss:Type="String">编号</Data></Cell><Cell><Data ss:Type="String">姓名</Data></Cell></Row>
   <Row><Cell><Data ss:Type="Number">1</Data></Cell><Cell><Data ss:Type="String">张三</Data></Cell></Row>
  </Table>
 </Worksheet>
</Workbook>

这种方案无需任何扩展,适合内网老旧环境。但样式控制弱,且大量数据拼接XML字符串会占用内存,建议超过五千行时改成分批写文件。

2. 使用PhpSpreadsheet生成真实xlsx

若环境允许Composer,PhpSpreadsheet是当下主流库,支持样式、公式、多Sheet。下面示例创建对象并填入数据。

<?php
require 'vendor/autoload.php';
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;

$sp = new Spreadsheet();
$sheet = $sp->getActiveSheet();
$sheet->setCellValue('A1', '编号');
$sheet->setCellValue('B1', '姓名');
$sheet->setCellValue('A2', 1);
$sheet->setCellValue('B2', '张三');

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="data.xlsx"');
$writer = new Xlsx($sp);
$writer->save('php://output');
exit;
?>

该库功能全面,但体积较大,在低配虚拟主机可能超内存。可通过setCellValueByColumnAndRow配合循环,并调用$sp->disconnectWorksheets()释放内存。

三、大数据导出与性能注意

当导出十万行以上,任何一次性读入数组的做法都会撑爆内存。正确思路是从数据库利用游标或LIMIT分批读取,边读边写给浏览器。CSV模式天然适合流式;XML模式可手动echo行标签。另外,在脚本开头设置set_time_limit(0)ini_set('memory_limit','256M')能减少中断。

最后提醒,无论哪种格式,都必须在输出内容前发送完所有header,且之前不能有空格或echo,否则会出现头部已送出的错误。掌握这些要点,PHP数据导出就能稳定支撑日常业务。

PHPExcel导出CSV导出修改时间:2026-08-10 22:57:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。