如何实现Excel单元格内多字段值不同字号换行,仓库数据分单元格
问题场景
当前代码导出Excel时,每个仓库的每个字段值会单独占用一个单元格,且各自应用预设字号。现在需要调整为:
- 单个仓库的所有字段值放在同一个单元格内,用换行分隔
- 每个字段值仍保留各自预设的字号
- 不同仓库的数据分别放在不同的单元格中
原代码:
$rowIndex = 1; foreach ($request->warehouses as $warehouse) { $whId = $warehouse['id_warehouse']; $warehouse = Warehouse::find($whId); if ($warehouse) { foreach ($rowDetails as $rowDetail) { $fieldName = $rowDetail['id_field']; $fieldValue = $warehouse->$fieldName; $fontSize = $rowDetail['font_size']; $cellData = "$fieldValue "; $sheet->setCellValue('A' . $rowIndex, $cellData); $sheet->getStyle('A' . $rowIndex)->getAlignment()->setWrapText(true); $sheet->getStyle('A' . $rowIndex)->getFont()->setSize($fontSize); $rowIndex++; } } }
修改后的实现代码
要实现同一单元格内不同字号的文本,需要用到PhpSpreadsheet的富文本对象,具体代码如下:
use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\Style\Font; $rowIndex = 1; foreach ($request->warehouses as $warehouseItem) { $whId = $warehouseItem['id_warehouse']; $warehouseModel = Warehouse::find($whId); if ($warehouseModel) { // 初始化富文本对象,整合当前仓库的所有字段内容 $richText = new RichText(); foreach ($rowDetails as $key => $rowDetail) { $fieldName = $rowDetail['id_field']; $fieldValue = $warehouseModel->$fieldName; $fontSize = $rowDetail['font_size']; // 创建对应字号的文本块 $textRun = $richText->createTextRun($fieldValue); $textRun->getFont()->setSize($fontSize); // 非最后一个字段时添加换行符 if ($key !== count($rowDetails) - 1) { $richText->createTextRun("\n"); } } // 将富文本写入单元格 $sheet->setCellValue('A' . $rowIndex, $richText); // 开启自动换行 $sheet->getStyle('A' . $rowIndex)->getAlignment()->setWrapText(true); // 让Excel自动适配行高(可选) $sheet->getRowDimension($rowIndex)->setRowHeight(-1); $rowIndex++; // 每个仓库仅占用一行,处理完再递增行号 } }
核心修改说明
- 富文本对象管理样式:用
RichText替代直接赋值单元格文本,支持给不同段落单独设置字号 - 仓库对应单个单元格:行号仅在处理完整个仓库后递增,保证一个仓库的数据在同一单元格内
- 单元格内换行控制:给非末尾字段添加换行符,配合自动换行属性实现预期排版
- 自动行高适配:设置行高为
-1让Excel根据内容自动调整高度,避免内容截断
内容的提问来源于stack exchange,提问作者moon
相关产品推荐
相关产品推荐

