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 --; }
错误分析与修复方案
核心错误点
$no = $no + $key导致行号异常跳变:
外层循环的$key是从0开始的索引值,每次循环时$no会累加当前索引,比如第二次循环$key=1,$no=2+1=3;第三次循环$key=2,$no=3+2=5——直接造成行号非连续递增,产生多余空行。外层循环末尾的
$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
相关产品推荐
相关产品推荐

