在实际项目开发中,经常需要将存储在XML格式中的数据导出为Excel文件,方便用户进行离线查看和二次处理。PHP提供了丰富的扩展和工具库,可以高效完成从XML解析到Excel生成的全流程操作。

XML数据源解析
首先需要对XML格式的数据源进行解析,PHP内置的SimpleXML扩展就能满足大部分XML解析需求,它可以将XML文档转换为方便操作的对象结构。如果是更复杂的XML文档,也可以使用DOMDocument扩展进行处理。
假设我们有一个存储用户信息的XML文件users.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user>
<id>2</id>
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
<user>
<id>3</id>
<name>王五</name>
<age>22</age>
<email>wangwu@ipipp.com</email>
</user>
</users>
使用SimpleXML解析这个XML文件的代码如下:
<?php
// 加载XML文件
$xml = simplexml_load_file('users.xml');
if ($xml === false) {
die('XML文件解析失败');
}
// 提取用户数据到数组
$userList = [];
foreach ($xml->user as $user) {
$userList[] = [
'id' => (int)$user->id,
'name' => (string)$user->name,
'age' => (int)$user->age,
'email' => (string)$user->email
];
}
print_r($userList);
Excel文件生成方案选择
PHP生成Excel文件有多种方案,常见的有生成CSV格式、生成XML格式的Excel(SpreadsheetML)、使用第三方库生成标准xlsx格式。如果需要生成兼容性更好的xlsx格式文件,推荐使用PhpSpreadsheet库,它是PHPExcel的继任者,功能完善且维护活跃。
首先需要通过Composer安装PhpSpreadsheet库:
composer require phpoffice/phpspreadsheet
完整生成流程实现
结合前面的XML解析和PhpSpreadsheet库,我们可以实现完整的从XML到Excel的生成逻辑,步骤如下:
- 解析XML数据源获取结构化数据
- 初始化
PhpSpreadsheet的Spreadsheet对象 - 设置Excel文件的表头和内容
- 设置HTTP响应头触发文件下载
完整的实现代码如下:
<?php
require 'vendor/autoload.php';
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;
// 1. 解析XML数据源
$xmlPath = 'users.xml';
$xml = simplexml_load_file($xmlPath);
if ($xml === false) {
die('无法加载XML文件');
}
$userData = [];
foreach ($xml->user as $user) {
$userData[] = [
(int)$user->id,
(string)$user->name,
(int)$user->age,
(string)$user->email
];
}
// 2. 初始化Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置工作表名称
$sheet->setTitle('用户列表');
// 3. 设置表头
$sheet->setCellValue('A1', '用户ID');
$sheet->setCellValue('B1', '姓名');
$sheet->setCellValue('C1', '年龄');
$sheet->setCellValue('D1', '邮箱');
// 4. 填充数据内容
$row = 2;
foreach ($userData as $item) {
$sheet->setCellValue('A' . $row, $item[0]);
$sheet->setCellValue('B' . $row, $item[1]);
$sheet->setCellValue('C' . $row, $item[2]);
$sheet->setCellValue('D' . $row, $item[3]);
$row++;
}
// 5. 设置列宽自适应
foreach (range('A', 'D') as $column) {
$sheet->getColumnDimension($column)->setAutoSize(true);
}
// 6. 设置HTTP响应头触发下载
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="用户数据_' . date('YmdHis') . '.xlsx"');
header('Cache-Control: max-age=0');
// 7. 输出文件
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
常见问题处理
中文乱码问题
如果XML文件编码不是UTF-8,解析时可能会出现中文乱码。可以在解析前将XML内容转换为UTF-8编码,或者在加载XML时指定编码参数。另外PhpSpreadsheet默认支持UTF-8编码,只要数据源是UTF-8格式,生成的Excel文件就不会出现乱码。
大文件处理
如果XML数据源数据量很大,一次性加载到内存可能会导致内存溢出。此时可以使用XMLReader扩展逐行解析XML,同时配合PhpSpreadsheet的分块写入功能,减少内存占用。如果需要生成非常大的Excel文件,也可以考虑生成CSV格式,CSV格式的处理效率更高,内存占用更低。
格式自定义
PhpSpreadsheet支持丰富的格式设置,比如单元格合并、字体样式、背景颜色、数字格式等。如果需要设置表头加粗,可以添加如下代码:
<?php
// 设置表头加粗
$sheet->getStyle('A1:D1')->getFont()->setBold(true);
// 设置表头背景颜色
$sheet->getStyle('A1:D1')->getFill()
->setFillType(PhpOfficePhpSpreadsheetStyleFill::FILL_SOLID)
->getStartColor()->setARGB('FFE0E0E0');
方案对比
不同Excel生成方案的特点对比如下:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 生成CSV | 实现简单、内存占用低、处理速度快 | 不支持复杂格式、兼容性稍差 | 数据量大、无格式要求的导出场景 |
| 生成SpreadsheetML | 无需第三方库、原生支持 | 格式支持有限、兼容性问题多 | 简单数据导出、环境限制无法安装库的场景 |
| PhpSpreadsheet生成xlsx | 格式支持丰富、兼容性好、功能完善 | 需要安装第三方库、内存占用相对较高 | 需要复杂格式、高兼容性的导出场景 |
PHPExcel生成XML解析SimpleXMLphpspreadsheet修改时间:2026-06-15 23:30:36