商城首页欢迎来到中国正版软件门户

您的位置:首页 >如何在 PhpSpreadsheet 中正确处理 XLSX 文件的中文显示问题

如何在 PhpSpreadsheet 中正确处理 XLSX 文件的中文显示问题

  发布于2026-04-01 阅读(0)

扫一扫,手机访问

如何在 PhpSpreadsheet 中正确处理 XLSX 文件的中文显示问题

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);

⚠️ 重要注意事项:

  • MPdf 字体必须预先注册:若使用 Noto Sans CJK SC 等开源字体,请先将其 .ttf 文件放入 MPdf 的 ttfonts/ 目录,并在 MPdf 初始化时调用 addFont() 或通过配置文件声明;
  • 避免依赖 Excel 原始字体:即使源文件中已设置“微软雅黑”,PhpSpreadsheet 可能因字体名称映射差异未能准确识别,显式覆盖默认样式是最可靠方式;
  • 单元格内联字体优先级更高:getDefaultStyle() 仅影响未显式设置字体的单元格;如需彻底统一,建议配合 $spreadsheet->getActiveSheet()->getStyle('A1:Z1000')->applyFromArray(...) 批量重置;
  • 验证字体可用性:可在导出前添加调试逻辑:
    var_dump($spreadsheet->getDefaultStyle()->getFont()->getName()); // 应输出预期字体名

总结:解决 PhpSpreadsheet + MPdf 中文 PDF 乱码问题,核心在于「字体链对齐」——从 XLSX 加载 → PhpSpreadsheet 默认样式 → MPdf 渲染引擎,三者必须使用同一套支持 Unicode 中文的字体体系。跳过编码设置(setInputEncoding 不存在且不适用),专注字体治理,即可稳定输出高质量中文 PDF。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注