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

如何实现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++; // 每个仓库仅占用一行,处理完再递增行号
    }
}

核心修改说明

  1. 富文本对象管理样式:用RichText替代直接赋值单元格文本,支持给不同段落单独设置字号
  2. 仓库对应单个单元格:行号仅在处理完整个仓库后递增,保证一个仓库的数据在同一单元格内
  3. 单元格内换行控制:给非末尾字段添加换行符,配合自动换行属性实现预期排版
  4. 自动行高适配:设置行高为-1让Excel根据内容自动调整高度,避免内容截断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:38:14