PhpSpreadsheet表格样式设置无效,行排序功能也无法正常工作
PhpSpreadsheet样式不生效及行排序异常问题
问题概述
使用PhpSpreadsheet处理Excel文件时,表格数据可正常展示,但以下两个功能异常:
- 通过
applyFromArray()设置的单元格样式完全不生效 - 基于列值的行排序功能无法工作
已通过Composer安装PhpSpreadsheet,删除行等基础功能正常,浏览器控制台无报错,文件路径无误。
当前代码片段
1. PhpSpreadsheet处理代码
require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; $inputFileName = 'upload/test.xlsx'; $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $spreadsheet = $reader->load($inputFileName); $worksheet = $spreadsheet->getActiveSheet(); $styleArray = [ 'borders' => [ 'outline' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK, 'color' => ['argb' => 'FFFF0000'], ], ], ]; $worksheet->getStyle('A1:F1')->applyFromArray($styleArray);
2. 网页表格展示代码
<div class="container"> <?php echo '<table class="table table-bordered">' . PHP_EOL; foreach ($worksheet->getRowIterator() as $row) { echo '<tr>' . PHP_EOL; $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(FALSE); foreach ($cellIterator as $cell) { echo '<td>' . $cell->getValue() . '</td>' . PHP_EOL; } echo '</tr>' . PHP_EOL; } echo '</table>' . PHP_EOL; ?> </div>
3. 正常工作的测试代码(删除行)
$spreadsheet->getActiveSheet()->removeRow(1, 1);
问题原因分析
- 样式不生效:当前仅通过
$cell->getValue()输出单元格内容,完全没有读取PhpSpreadsheet对象中存储的样式信息。PhpSpreadsheet的样式是保存在内存对象中的,不会自动转换为HTML的style属性。 - 排序功能异常:未调用PhpSpreadsheet的排序方法,默认不会自动对行进行排序。
解决方案
1. 让样式在网页展示中生效
需要手动读取单元格的样式属性,将其转换为HTML的style属性输出。示例修改后的展示代码:
<div class="container"> <?php echo '<table class="table table-bordered">' . PHP_EOL; // 获取A1:F1的样式对象 $headerStyle = $worksheet->getStyle('A1:F1'); $border = $headerStyle->getBorders()->getOutline(); $borderStyle = $border->getBorderStyle(); $borderColor = $border->getColor()->getARGB(); // 转换ARGB为CSS颜色(去掉开头的FF) $cssColor = '#' . substr($borderColor, 2); $cssBorder = ''; // 转换PhpSpreadsheet的边框样式为CSS样式 switch($borderStyle) { case \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK: $cssBorder = '5px solid ' . $cssColor; break; // 可根据需要添加其他边框样式的转换 } foreach ($worksheet->getRowIterator() as $row) { echo '<tr>' . PHP_EOL; $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(FALSE); $rowIndex = $row->getRowIndex(); foreach ($cellIterator as $cell) { $cellStyle = ''; // 仅给第一行应用样式 if($rowIndex === 1 && in_array($cell->getColumn(), range('A', 'F'))) { $cellStyle = 'style="border:' . $cssBorder . ';"'; } echo '<td ' . $cellStyle . '>' . $cell->getValue() . '</td>' . PHP_EOL; } echo '</tr>' . PHP_EOL; } echo '</table>' . PHP_EOL; ?> </div>
2. 实现行排序功能
在读取数据前调用PhpSpreadsheet的sort()方法,示例:
// 在设置样式之前执行排序,按A列升序排列 $worksheet->sort('A', \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SORT_ASCENDING); // 之后再设置样式、输出数据 $worksheet->getStyle('A1:F1')->applyFromArray($styleArray);
替代方案(生成带样式的Excel文件)
如果需求是生成带样式的Excel文件而非网页展示,可使用Writer保存文件:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('output_with_style.xlsx');
内容的提问来源于stack exchange,提问作者ChrVik
相关产品推荐
相关产品推荐

