phpexcel中文乱码需设utf-8字符集并用正确content-type头;导入.xlsx须手动注册excel2007读取器;大数据量需分sheet导出并禁用公式计算;推荐迁移到phpoffice/phpspreadsheet。

导出 Excel 时中文乱码,PHPExcel 不认 UTF-8 怎么办
根本原因不是编码没设对,而是 PHPExcel(该扩展底层依赖)默认用 ISO-8859-1 处理字符串,连 mb_convert_encoding() 都救不了——它在写入单元格前就已内部转码失败。
- 必须在创建
PHPExcel实例后、写入数据前,显式设置默认编码:$objExcel = new \PHPExcel(); $objExcel->getDefaultStyle()->getFont()->setName('Microsoft YaHei'); $objExcel->getDefaultStyle()->getFont()->setSize(10); // 关键:强制指定字符集为 UTF-8 $objExcel->getProperties()->setCreator('Yii2')->setLastModifiedBy('Yii2'); // 不要试图改 header 或输出前 mb_convert_encoding,无效 - 导出响应头必须带
charset=utf-8,且不能用Content-Type: application/vnd.ms-excel(老 IE 兼容写法),得用:<pre class="brush:php;toolbar:false;">header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8'); - 如果字段含中文标点或 emoji,直接写入会报
PHP Warning: mb_strlen(): Unknown encoding "UTF-8" —— 检查你项目是否禁用了 <code>mbstring扩展,php -m | grep mbstring确认
moonlandsoft/yii2-phpexcel 导入时读不到 .xlsx 文件
这个扩展默认只启用 Excel5(即 .xls)读取器,.xlsx 属于 Excel2007 格式,不手动注册加载器就直接抛 Could not auto-detect spreadsheet type。
- 导入前必须手动注册
Excel2007:$objReader = \PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load($file_path); - 不要依赖
createReader('auto'),它在某些 PHP 版本(如 7.4+)下识别率极低,尤其文件无扩展名或 MIME 类型被篡改时 - 如果上传的是 .xlsb 或 .ods,该扩展原生不支持,得换
PhpSpreadsheet,别硬扛
导出大数据量 Excel 内存溢出,setActiveSheetIndex(0) 也救不了
不是活动表设置问题,是 PHPExcel 把整张表全载入内存,10 万行 × 20 列基本就崩。它没有流式写入能力,setPreCalculateFormulas(false) 只能减缓,不能根治。
- 单 Sheet 数据超 5 万行,必须分 Sheet 导出:
for ($i = 0; $i createSheet(); $sheet->setTitle('Data_' . ceil(($i + 1) / 50000)); // 写入 $data[$i] 到 $data[$i+49999] } - 禁用计算引擎和样式缓存:
$objPHPExcel->setCalculateFormula(false); $objPHPExcel->getActiveSheet()->duplicateStyle($objPHPExcel->getDefaultStyle(), 'A1:Z1000');
- 导出完成后立刻调用
unset($objPHPExcel),PHP 7.4+ 下gc_collect_cycles()可提前回收,否则内存不释放
升级 Yii2 到 2.0.40+ 后 moonlandsoft/yii2-phpexcel 报类找不到
这不是 Composer 自动加载失效,而是该扩展已停止维护,其 composer.json 声明的最低 PHP 版本是 5.4,而新 Yii2 强制要求 symfony/filesystem ^5.0,与它依赖的旧版 phpexcel 冲突。
- Composer 安装时加
--ignore-platform-reqs是饮鸩止渴,运行时仍会因命名空间冲突失败 - 唯一可靠方案是迁移到
phpoffice/phpspreadsheet,并用官方推荐的 Yii2 封装:codemix/yii2-excel(轻量、无弃用警告) - 如果必须保留原扩展,只能锁死
"moonlandsoft/yii2-phpexcel": "1.1.1"并降级yiisoft/yii2到 2.0.38 —— 但安全补丁就没了
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











