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

Laravel Excel导出如何让数据行在多行表头之后渲染输出

问题原因

你设置startRow=7不生效、数据始终从第一行写入的核心原因是:Laravel Excel 不会直接读取调用时传入的startRow参数,必须让导出类实现WithCustomStartCell接口声明数据起始位置,自定义起始行配置才会生效。
另外你把报表大标题、空行都塞到headings()方法返回值里的写法很容易造成行号计算偏移,也会干扰默认的写入逻辑。

解决步骤

1. 引入并实现对应接口

首先在导出类顶部引入WithCustomStartCell契约,然后让导出类实现该接口,新增startCell()方法指定数据从A7单元格(第6行列头的下一行)开始写入:

// 引入类
use Maatwebsite\Excel\Concerns\WithCustomStartCell;

// 修改类实现的接口列表,加上WithCustomStartCell
class TahapSeleksiExport implements FromCollection, WithHeadings, WithColumnWidths, WithStyles, WithEvents, WithCustomStartCell
{
    // ... 其他原有代码不变

    // 新增方法,指定数据起始单元格
    public function startCell(): string
    {
        return 'A7';
    }
}

2. 简化headings方法

headings()方法只返回第6行的真实列头即可,不要把前面的大标题、空行放到返回值里,框架会自动把列头写到你指定的startCell的上一行(也就是A6,正好是你要放蓝底白字列头的位置):

public function headings():array
{
    return [
        'ID Pelamar',
        'Nama',
        'Jurusan',
        'Angkatan',
        'Tanggal Submit',
        'Nilai',
        'Lulus',
    ];
}

3. 手动写入前几行的报表标题

前2-4行的大标题内容,直接放到afterSheet事件里手动写入即可,和你之前写样式、合并单元格的逻辑放在一起,行号完全可控:

public static function afterSheet(AfterSheet $event)
{
    $sheet = $event->sheet->getDelegate();
    // 读取导出类实例中的id查询标题数据
    $tahap = Tahap::where('id_tahap', $event->getConcernable()->id)->first();

    // 写入大标题
    $sheet->setCellValue('A2', $tahap->nama);
    $sheet->setCellValue('A3', 'Seleksi Alumni');
    $sheet->setCellValue('A4', 'BKK SMKN 1 Kota Bekasi');

    // 原有样式设置逻辑保留即可
    $sheet->getStyle(2)->getFont()->setSize(16);
    $sheet->getStyle(3)->getFont()->setSize(14);
    $sheet->getStyle(4)->getFont()->setSize(14);

    $sheet->getStyle('A6:G6')->getFont()
        ->setBold(true)
        ->getColor()->setRGB('ffffff');

    $sheet->getStyle('A6:G6')->getFill()
        ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
        ->getStartColor()->setARGB('2041BB');
}

你原来在styles()方法里写的合并单元格、行加粗逻辑不需要改动,保留即可。

效果说明

改完之后框架的写入逻辑会完全符合预期:

  1. 第1、5行默认留空
  2. 第2-4行是合并单元格后的大标题
  3. 第6行是蓝底白字的列头
  4. 业务数据从第7行开始逐行写入,不会再覆盖表头内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:15:35