必须换 phpspreadsheet,因 phpexcel 已停更六年,在 php 7.4+ 下连 phpexcel_iofactory 都无法实例化;phpspreadsheet 原生支持 psr-4 和 ci 加载机制,导出原生 .xlsx,兼容现代 excel 客户端。

别用 PHPExcel,它已停更六年,PHP 7.2+ 下直接报错 Methods with the same name as their class will not be constructors;CI 3.x 项目若还在用,升级 PHP 或部署到新服务器时大概率崩。
为什么必须换 PhpSpreadsheet
CI 3.1.11+ 要求 PHP ≥ 5.6,而 PHPExcel 最后兼容版(1.8.2)在 PHP 7.4 上连 PHPExcel_IOFactory 都实例化失败;手动改类名、补构造函数只是临时糊墙,composer autoload 也压根不认它。而 PhpSpreadsheet 原生支持 PSR-4,$this->load->library('PhpSpreadsheet') 就能直接接入 CI 的加载机制,且默认导出 .xlsx,兼容现代 Excel 客户端。
- Composer 安装命令是:
composer require phpoffice/phpspreadsheet - CI 配置里设
$config['composer_autoload'] = 'vendor/autoload.php';,或手动在application/libraries/PhpSpreadsheet.php中写一行:require_once APPPATH . 'vendor/autoload.php'; - 不要试图把
PhpSpreadsheet类文件复制进libraries/目录——它依赖完整命名空间和自动加载,硬塞会报Class not found
导出带格式的 .xlsx 文件(推荐方案)
这是真报表场景下的标准做法:支持列宽、边框、日期格式、数字千分位、公式、多 sheet,且输出的是原生 .xlsx,不是伪装成 Excel 的 HTML 表格。
- 控制器中需
use PhpOffice\PhpSpreadsheet\Spreadsheet和use PhpOffice\PhpSpreadsheet\Writer\Xlsx - 写数据优先用
setCellValueByColumnAndRow($col, $row, $value),比setCellValue('A1', ...)更易循环处理数组字段 - 中文乱码?确保数据库查询结果是 UTF-8(CI 默认已处理),且不要对单元格内容再做
iconv或mb_convert_encoding——PhpSpreadsheet原生支持 UTF-8 字符串 - 输出前必须设置 header:
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,用application/vnd.ms-excel会导致 Excel 打开提示“文件格式与扩展名不匹配”
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="report_' . date('Y-m-d') . '.xlsx"');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
用 HTML 表格模拟 Excel(仅限快速预览)
如果只是内部看一眼、字段少、无格式要求、不想装额外包,可以用 table + header() 强制下载,但本质是 HTML 文件,Excel 打开后所有样式都不可控,且无法处理公式、合并单元格、长数字(如身份证号变科学计数法)。
- 关键 header 是:
Content-Type: application/vnd.ms-excel(注意不是openxmlformats) - 中文字段要加
<meta charset="UTF-8">,否则 Excel 可能显示为乱码 - 单元格内可嵌入 Excel 格式指令,比如:
<td style="mso-number-format:'@'">410522198402161833</td>强制文本格式,防身份证被转成数字 - 不建议在生产环境用这个方式导出给客户——打开报错、格式错乱、列宽崩塌都是常态
CI-Excel-Generation-Library 这类轻量库能不能用
可以,但只适合字段固定、无样式需求、数据量小(PHPExcel,所以同样存在 PHP 版本兼容问题;GitHub 上最后更新是 2014 年,作者已归档仓库,CI 4.x 完全不兼容。
- 它的
make_from_array()写法确实简单,但字段顺序靠数组下标,一旦中间加字段就全乱 - 生成的文件是
.xls(BIFF8 格式),Excel 2016+ 打开会提示“文件损坏”,需手动确认恢复 - 若你已在用它且没出问题,暂时可维持;但新项目或要长期维护的系统,请直接切到
PhpSpreadsheet
真正容易被忽略的点是:导出大表(比如 >5k 行)时,PhpSpreadsheet 默认内存占用高,可能触发 PHP memory_limit 错误;此时得用 setCellValueExplicit() 避免类型推断,或启用缓存驱动(Memory → IGBINARY),但这些优化不在基础导出流程里——先跑通,再压测,别一上来就堆配置。











