You need to enable JavaScript to run this app. Laravel使用maatwebsite/excel导出Excel无法保留单元格前缩进空格
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用maatwebsite/excel导出Excel无法保留单元格前缩进空格

问题原因

maatwebsite/excel 底层依赖 PhpSpreadsheet 解析HTML视图时,会默认合并所有连续的空白字符,同时不会解析HTML中的 、 等空格实体,也不会将CSS的padding样式转换为Excel单元格格式,所以你之前的尝试都无效。


解决方案

方案1:最小改动,保留视图导出方式

直接替换视图中的空格实体为UTF-8不间断空格,Blade输出时不转义即可,无需修改导出类:
修改charts-raw-children.blade.php中的缩进部分:

@if($level > 1)
    {!! str_repeat(html_entity_decode(' '), $level * 3) !!}
@endif

$level * 3是控制缩进宽度的倍数,可根据需求自行调整。如果仍存在空格合并问题,可替换为硬编码的UTF-8不间断空格:

@if($level > 1)
    {!! str_repeat(chr(0xC2).chr(0xA0), $level * 3) !!}
@endif

方案2:更规范,用Excel原生缩进样式(效果最优)

放弃视图导出方式,改用集合导出+单元格原生样式控制,导出的缩进对齐完全统一,不会出现空格宽度不一致的问题,同时兼容你之前的背景色、字体样式需求:

修改ChartOfAccountsExport.php代码:

<?php

namespace App\Exports;

use App\UserAccountingHead;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithColumnWidths;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use Auth;
use Illuminate\Support\Collection;

class ChartOfAccountsExport implements FromCollection, ShouldAutoSize, WithColumnWidths, WithStyles, WithHeadings
{
    protected $rows = [];

    public function __construct()
    {
        $user = Auth::user();
        $accounting_heads = $user->company->accountingHeads;
        $parent_accounting_heads = $accounting_heads->whereNull('parent_id')->where('visibility', true);
        // 递归拼装带层级的数据
        $this->buildRows($parent_accounting_heads, 0);
    }

    protected function buildRows($accounts, $level)
    {
        foreach ($accounts as $account) {
            $this->rows[] = [
                'code' => $account->custom_code,
                'name' => $account->name,
                'type' => $level <= 1 ? 'Control' : '',
                'level' => $level,
            ];
            // 递归子级
            $children = $account->where('parent_id', $account->id)->get();
            if ($children->isNotEmpty()) {
                $this->buildRows($children, $level + 1);
            }
        }
    }

    public function headings(): array
    {
        return [
            __('labels.code'),
            __('labels.account_name'),
            __('labels.account_type'),
        ];
    }

    public function collection()
    {
        // 去掉level字段,只返回需要导出的三列
        return collect($this->rows)->map(function ($row) {
            return [$row['code'], $row['name'], $row['type']];
        });
    }

    public function columnWidths(): array
    {
        return [
            'B' => 55,            
        ];
    }

    public function styles(Worksheet $sheet)
    {
        $styles = [
            1    => ['font' => ['bold' => true]],
            'A'  => ['font' => ['size' => 16]],
            'C'  => ['font' => ['size' => 16]],
        ];

        // 给B列(账户名称)按层级设置缩进和样式
        foreach ($this->rows as $index => $row) {
            $rowNum = $index + 2; // 行号从2开始,跳过表头
            $styles["B$rowNum"] = [
                'font' => [
                    'size' => 16,
                    'color' => $row['level'] <= 1 ? ['argb' => 'FFFFFFFF'] : [],
                ],
                'alignment' => [
                    'indent' => $row['level'],
                ],
                'fill' => $row['level'] <= 1 ? [
                    'fillType' => Fill::FILL_SOLID,
                    'startColor' => ['argb' => 'FF0E68B1'],
                ] : [],
            ];
        }

        return $styles;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 18:06:03