Laravel Excel生成CSV时如何移除短行自动补全的空列
Laravel Excel生成CSV时自动补尾部空列的解决方案
问题现象
- 基于数组数据生成CSV文件时,组件默认以全局最大列数为基准,给列数更少的行尾部自动补空列
- 复现案例:两行测试数据,第一行3列内容为
One | Two | Three,第二行4列内容为One | Two | Three | Four,默认生成的文件第一行实际输出为"One", "Two", "Three", "",尾部多了带空引号的空列 - 预期输出:各行保留原始列数,第一行仅输出3列,无多余空列及空引号
实现方案
方案1:通过内置配置关闭短行补全(推荐,适用于3.2及以上版本)
Laravel Excel提供了专门的配置项控制短行自动补全行为,支持全局配置或单导出类配置两种方式:
- 全局生效:修改配置文件
config/excel.php,在exports的csv配置块中关闭补全逻辑
'exports' => [ 'csv' => [ // 其余原有配置保持不变 'pad_short_rows_with_empty_cells' => false, ], ],
- 单导出类生效:让导出类实现
WithCustomCsvSettings接口,重写CSV配置方法,仅对当前导出任务关闭补全
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromArray; use Maatwebsite\Excel\Concerns\WithCustomCsvSettings; class TestExport implements FromArray, WithCustomCsvSettings { public function array(): array { return [ ['One', 'Two', 'Three'], ['One', 'Two', 'Three', 'Four'], ]; } public function getCsvSettings(): array { return [ 'pad_short_rows_with_empty_cells' => false ]; } }
方案2:事件监听修改底层逻辑(适用于低版本)
如果使用的版本没有上述配置项,可以通过事件监听调用底层PhpSpreadsheet的方法关闭自动补全:
- 导出类实现
WithEvents接口 - 注册
BeforeSheet事件,在工作表初始化时关闭短行填充开关
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromArray; use Maatwebsite\Excel\Concerns\WithEvents; use Maatwebsite\Excel\Events\BeforeSheet; class TestExport implements FromArray, WithEvents { public function array(): array { return [ ['One', 'Two', 'Three'], ['One', 'Two', 'Three', 'Four'], ]; } public function registerEvents(): array { return [ BeforeSheet::class => function (BeforeSheet $event) { $event->sheet->getDelegate()->setPadShortRows(false); } ]; } }
注意事项
关闭短行自动补全后,CSV每一行的列数完全和传入数组的长度一致,不会再做全局对齐。如果业务要求所有行列数统一,需要自行处理数组长度后再传入导出逻辑。
内容的提问来源于stack exchange,提问作者Muhammad Dawaki
相关产品推荐
相关产品推荐

