如何在laravel-excel导出时添加行号列并设置顶部两行作为表标题
实现方案
一、生成逐行递增序号
Laravel-Excel 的map()方法默认仅传入当前行数据,无法直接获取索引,我们可以通过给导出类新增计数器属性实现序号生成:
- 给导出类新增私有属性
$rowCount,初始值设为0,用于记录当前行序号 - 在
map()方法中每处理一行数据先给计数器自增1,将自增后的值作为第一列返回 - 同步修改
headings()方法,首列新增「序号」表头项
二、实现顶部两行总标题
通过Laravel-Excel的事件监听机制,在数据写入前主动在工作表顶部插入两行作为总标题:
- 给导出类实现
WithEvents接口 - 监听
BeforeWriting事件,在数据写入前插入两行空行,设置总标题内容,还可按需调整标题样式
完整修改代码
use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithMapping; use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithEvents; use Maatwebsite\Excel\Events\BeforeWriting; use PhpOffice\PhpSpreadsheet\Style\Alignment; class YourExport implements FromCollection, WithMapping, WithHeadings, WithEvents { // 新增行计数器 private $rowCount = 0; // 你原有获取导出数据的collection方法保留即可,此处省略 public function collection() { // 原有获取数据逻辑 } public function map($row): array { // 每处理一行计数器自增1 $this->rowCount++; $fields = [ // 第一列插入序号 $this->rowCount, Date::dateTimeToExcel($row->date), $row->title, $row->link, $row->file, $row->description, ]; return $fields; } public function headings(): array { $fields = [ '序号', // 新增序号表头 'Date', 'Title', 'Link', 'Evidence', 'Desc', ]; return $fields; } // 实现事件方法插入顶部总标题 public function registerEvents(): array { return [ BeforeWriting::class => function(BeforeWriting $event) { $sheet = $event->sheet->getDelegate(); // 在最顶部插入2行空行 $sheet->insertNewRowBefore(1, 2); // 第一行总标题,合并A到F列(共6列,列数变化可自行调整范围) $sheet->mergeCells('A1:F1'); $sheet->setCellValue('A1', '你的自定义总标题内容'); // 第二行可设置副标题,不需要可删除 $sheet->mergeCells('A2:F2'); $sheet->setCellValue('A2', '自定义副标题内容'); // 可选:给标题设置样式,加粗居中、调整行高 $sheet->getStyle('A1:A2')->applyFromArray([ 'font' => [ 'bold' => true, 'size' => 16, ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], ]); $sheet->getRowDimension(1)->setRowHeight(30); $sheet->getRowDimension(2)->setRowHeight(25); } ]; } }
注意事项
- 如果你的导出列数有变化,需要对应修改合并单元格的范围,比如共7列就改为
A1:G1 - 序号默认从1开始逐行递增,不受分页影响,多sheet导出时每个sheet单独初始化计数器即可
- 不需要第二行副标题的话,可直接删除第二行赋值、合并逻辑,保留空行也满足需求
内容的提问来源于stack exchange,提问作者Ray Coder
相关产品推荐
相关产品推荐

