您的位置:首页 >如何在 PhpSpreadsheet 中正确处理 XLSX 文件的中文显示问题
发布于2026-04-01 阅读(0)
扫一扫,手机访问

PhpSpreadsheet 本身不支持通过 setInputEncoding 设置编码(因其基于 XML 的 XLSX 格式无传统字符编码概念),中文乱码的根本原因通常是单元格字体未包含中文字形;解决方案是统一设置默认字体为支持中文的字体(如 SimSun、Noto Sans CJK 或 Microsoft YaHei),并在导出 PDF 时确保渲染引擎(如 MPdf)同步配置对应字体。
PhpSpreadsheet 本身不支持通过 `setInputEncoding` 设置编码(因其基于 XML 的 XLSX 格式无传统字符编码概念),中文乱码的根本原因通常是单元格字体未包含中文字形;解决方案是统一设置默认字体为支持中文的字体(如 SimSun、Noto Sans CJK 或 Microsoft YaHei),并在导出 PDF 时确保渲染引擎(如 MPdf)同步配置对应字体。
PhpSpreadsheet 读取 .xlsx 文件时,不会主动解析或转换字符编码——这是因为 XLSX 是基于 OPC(Office Open XML)标准的 ZIP 压缩包,内部所有文本均以 UTF-8 编码存储于 XML 文件中,天然支持中文。因此,所谓“中文乱码”并非编码错误,而是字体缺失导致的渲染失败:当 Excel 单元格使用了不包含中文字符集的字体(如 Calibri、Arial)时,PhpSpreadsheet 会忠实继承该样式;后续通过 MPdf 渲染为 PDF 时,若 MPdf 未加载对应中文字体,就会显示方框、空白或替换成默认西文字体,造成“文字错误”的假象。
✅ 正确做法是:在加载工作簿后、导出前,强制设置整个工作簿的默认字体为支持中文的字体,并确保 MPdf 环境已正确注册该字体。以下是完整、可落地的代码示例:
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
$reader = new Xlsx();
$spreadsheet = $reader->load($public['root'] . '/' . $fileName);
// ✅ 关键步骤:设置全局默认字体(必须为系统/MPdf 支持的中文字体)
$styleArray = [
'font' => [
'name' => 'SimSun', // Windows 简体中文默认字体(宋体)
// 'name' => 'Noto Sans CJK SC', // 推荐跨平台方案(需提前注册到 MPdf)
// 'name' => 'Microsoft YaHei', // 微软雅黑,更现代的显示效果
'size' => 11,
],
];
$spreadsheet->getDefaultStyle()->applyFromArray($styleArray);
// 配置 MPdf writer(务必启用字体子集与中文字体路径)
$writer = IOFactory::createWriter($spreadsheet, 'Mpdf');
$writer->setOptions([
'tempDir' => sys_get_temp_dir(),
]);
$pdfName = str_replace($extension, '.pdf', $fileName);
$writer->save($public['root'] . '/' . $pdfName);⚠️ 重要注意事项:
var_dump($spreadsheet->getDefaultStyle()->getFont()->getName()); // 应输出预期字体名
总结:解决 PhpSpreadsheet + MPdf 中文 PDF 乱码问题,核心在于「字体链对齐」——从 XLSX 加载 → PhpSpreadsheet 默认样式 → MPdf 渲染引擎,三者必须使用同一套支持 Unicode 中文的字体体系。跳过编码设置(setInputEncoding 不存在且不适用),专注字体治理,即可稳定输出高质量中文 PDF。
下一篇:脉脉好友资料查看设置方法
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9