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

Laravel循环生成Excel多余行问题排查(列起始问题已解决)

Excel生成函数空行问题排查与修复

我有一个从数据生成Excel文件的函数,此前存在两类问题:黄色标记的问题(数据应从第2行开始,A2值为1)已解决,但蓝色标记的问题仍存在——代码会为每个数据对象添加多余空行(每组数据额外增加2行空行)。以下是负责打印数据的原循环代码、调整后的代码,以及错误分析和修复方案。

原代码

$no = 2;
foreach ($br as $key => $value) {
    $no = $no + $key;
    $sheet->setCellValue('A'.$no, $key+1);
    $sheet->setCellValue('B'.$no, $value->va_number);
    $sheet->setCellValue('C'.$no, $value->customer_name);
    $sheet->setCellValue('D'.$no, $value->cabang);
    $sheet->setCellValue('E'.$no, $value->payment_date);
    $sheet->setCellValue('F'.$no, $value->payment_amount);
    $sheet->setCellValue('G'.$no, $value->br_no);
    
    $dtl = DB::table('bank_receive_dtl')
    ->join('inv','inv.id','=','bank_receive_dtl.inv_id')
    ->where('bank_receive_dtl.br_id','=',$value->br_id)
    ->select('bank_receive_dtl.*','inv.inv_no')
    ->get();
    foreach ($dtl as $key => $item) {
        $no ++;
        $sheet->setCellValue('H'.$no, $item->inv_no);
        $sheet->setCellValue('I'.$no, $item->payment_amount);
    }
    $no--;
}

调整后代码(已解决黄色标记问题)

$no = 2;
foreach ($br as $key => $value) {
    $no = $no + $key;
    $sheet->setCellValue('A'.$no, $key+1);
    $sheet->setCellValue('B'.$no, $value->va_number);
    $sheet->setCellValue('C'.$no, $value->customer_name);
    $sheet->setCellValue('D'.$no, $value->cabang);
    $sheet->setCellValue('E'.$no, $value->payment_date);
    $sheet->setCellValue('F'.$no, $value->payment_amount);
    $sheet->setCellValue('G'.$no, $value->br_no);
    
    $dtl = DB::table('bank_receive_dtl')
    ->join('inv','inv.id','=','bank_receive_dtl.inv_id')
    ->where('bank_receive_dtl.br_id','=',$value->br_id)
    ->select('bank_receive_dtl.*','inv.inv_no')
    ->get();
    foreach ($dtl as $index => $item) {
        $sheet->setCellValue('H'.$no, $item->inv_no);
        $sheet->setCellValue('I'.$no, $item->payment_amount);
        $no ++;   // <--moved down here
    }
    $no --;
}

错误分析与修复方案

核心错误点

  1. $no = $no + $key 导致行号异常跳变:
    外层循环的$key是从0开始的索引值,每次循环时$no会累加当前索引,比如第二次循环$key=1,$no=2+1=3;第三次循环$key=2,$no=3+2=5——直接造成行号非连续递增,产生多余空行。

  2. 外层循环末尾的$no--操作冗余且错误:
    调整后的代码中,内层循环先写入当前$no行的H/I列,再自增$no。内层循环结束后$no已指向明细行的下一行,此时执行$no--会回退行号,导致下一次外层循环的行号重复或跳变,进一步加剧空行问题。

修复后的代码

$no = 2; // 从第2行开始写入数据
foreach ($br as $index => $value) {
    // 写入主数据行
    $sheet->setCellValue('A'.$no, $index + 1); // A列序号从1开始
    $sheet->setCellValue('B'.$no, $value->va_number);
    $sheet->setCellValue('C'.$no, $value->customer_name);
    $sheet->setCellValue('D'.$no, $value->cabang);
    $sheet->setCellValue('E'.$no, $value->payment_date);
    $sheet->setCellValue('F'.$no, $value->payment_amount);
    $sheet->setCellValue('G'.$no, $value->br_no);
    
    // 获取关联明细数据
    $dtl = DB::table('bank_receive_dtl')
        ->join('inv','inv.id','=','bank_receive_dtl.inv_id')
        ->where('bank_receive_dtl.br_id','=',$value->br_id)
        ->select('bank_receive_dtl.*','inv.inv_no')
        ->get();
    
    // 写入明细数据(如果有)
    foreach ($dtl as $item) {
        $no++; // 先自增行号,写入下一行
        $sheet->setCellValue('H'.$no, $item->inv_no);
        $sheet->setCellValue('I'.$no, $item->payment_amount);
    }
    
    $no++; // 主数据和明细写完后,行号移到下一组数据的起始行
}

修复说明

  • 移除$no = $no + $key的错误累加逻辑,改为根据实际写入行数正常递增$no。
  • 调整内层循环的行号处理:有明细数据时先自增$no再写入,确保明细行紧随主数据行之后。
  • 外层循环末尾执行$no++,确保下一组数据从下一行开始,避免产生多余空行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:07:54