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
相关产品推荐
相关产品推荐

