You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHPSpreadsheet转Excel为数组丢失格式,如何转为带格式HTML?

将Excel转换为带格式的HTML(PHPSpreadsheet实现)

我明白你现在的困扰——用PHPSpreadsheet转数组时没法保留单元格的格式(比如数值样式、字体、颜色这些),想要直接导出成带完整格式的HTML对吧?其实PHPSpreadsheet本身就内置了HTML导出功能,能自动识别并保留Excel里的各种样式,比手动解析样式再拼接HTML高效多了。

为什么原来的方法无法保留格式?

你之前的代码里虽然设置了$reader->setReadDataOnly(false),但只读取了单元格的原始值(getValue()),没有去解析和存储单元格的样式信息;而且数组本身也没法承载格式这类复杂信息,所以自然没法保留。

解决方案:使用PHPSpreadsheet的HTML Writer

直接用PHPSpreadsheet自带的Html写入器,它会自动处理所有单元格格式,包括:

  • 数值格式(日期、货币、百分比等)
  • 字体样式(大小、颜色、加粗/斜体)
  • 单元格对齐方式
  • 背景色、边框
  • 合并单元格(如果有的话)

下面是修改后的ExcelService类,新增一个导出带格式HTML的方法:

namespace App\Service;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use PhpOffice\PhpSpreadsheet\IOFactory as ExcelFactory;
use PhpOffice\PhpSpreadsheet\Writer\Html; // 新增HTML写入器引入

class ExcelService {
    // 原来的转数组方法保留不变
    public function getArray(UploadedFile $uploadedFile): array {
        $path = \sprintf('%s/%s', $uploadedFile->getPath(), $uploadedFile->getFilename());
        $reader = ExcelFactory::createReaderForFile($path);
        $reader->setReadDataOnly(false);
        $spreadsheet = $reader->load($path);
        $sheet = $spreadsheet->getActiveSheet();
        $maxCol = $sheet->getHighestDataColumn();
        $maxRow = $sheet->getHighestDataRow();
        $colAlpha = \range('A', $maxCol);
        $colRange = \count($colAlpha);
        $array = [];
        for ($indexRow = 0; $indexRow <= $maxRow; $indexRow++) {
            for ($indexCol = 0; $indexCol < $colRange; $indexCol++) {
                $cellCoords = \sprintf('%s%d', $colAlpha[$indexCol], $indexRow + 1);
                $cellObject = $sheet->getCell($cellCoords);
                $cellValue = \trim((string) $cellObject->getValue());
                $array[$indexRow][$indexCol] = $cellValue;
            }
        }
        return $array;
    }

    // 新增:导出带格式的HTML方法
    public function getFormattedHtml(UploadedFile $uploadedFile): string {
        $path = \sprintf('%s/%s', $uploadedFile->getPath(), $uploadedFile->getFilename());
        
        // 读取Excel文件,必须开启样式读取
        $reader = ExcelFactory::createReaderForFile($path);
        $reader->setReadDataOnly(false);
        $spreadsheet = $reader->load($path);

        // 创建HTML写入器实例
        $writer = new Html($spreadsheet);

        // 可选配置:
        // 1. 只导出当前激活的工作表(默认导出所有表)
        $writer->setSheetIndex($spreadsheet->getActiveSheetIndex());
        // 2. 设置样式嵌入方式:内联样式(默认)或单独输出CSS
        // $writer->setEmbedCSS(true); // 内联样式,适合独立HTML文件
        // $writer->setOutputCSS(true); // 将样式输出到<style>标签中

        // 生成完整HTML内容(包含<head>和<body>)
        $html = $writer->generateHTMLHeader();
        $html .= $writer->generateSheetData();
        $html .= $writer->generateHTMLFooter();

        // 如果你只需要表格部分(不带HTML头尾),可以直接返回:
        // return $writer->generateSheetData();

        return $html;
    }
}

额外说明

  1. 数值格式的特殊处理:如果只是需要带数值格式的文本(不需要HTML样式),可以在原来的数组方法里把getValue()换成getFormattedValue(),比如:

    $cellValue = \trim((string) $cellObject->getFormattedValue());
    

    这样能得到Excel里显示的格式化文本(比如日期转成2024-05-20,货币转成¥100.00),但依然没法保留字体、颜色这类样式。

  2. 样式定制:如果需要对HTML输出做个性化调整(比如修改默认样式),可以在生成HTML前,先通过PHPSpreadsheet的API修改工作表或单元格的样式,再调用HTML Writer导出。

内容的提问来源于stack exchange,提问作者HelpNeeder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:48:56