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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:09:01