使用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; } }
额外说明
数值格式的特殊处理:如果只是需要带数值格式的文本(不需要HTML样式),可以在原来的数组方法里把
getValue()换成getFormattedValue(),比如:$cellValue = \trim((string) $cellObject->getFormattedValue());这样能得到Excel里显示的格式化文本(比如日期转成
2024-05-20,货币转成¥100.00),但依然没法保留字体、颜色这类样式。样式定制:如果需要对HTML输出做个性化调整(比如修改默认样式),可以在生成HTML前,先通过PHPSpreadsheet的API修改工作表或单元格的样式,再调用HTML Writer导出。
内容的提问来源于stack exchange,提问作者HelpNeeder
相关产品推荐
相关产品推荐

