FPDF生成报表数据重叠求助:如何实现记录逐行排列
解决FPDF渲染记录重叠问题:让每条记录依次上下排列
你遇到的问题很典型——每次循环都用固定的SetXY坐标定位,导致所有记录都输出到同一个位置,自然就重叠了。核心思路是每次输出完一条记录后,把Y坐标向下移动一段距离(行高),下面给你几种具体的解决方法:
方法1:用Cell+Ln()自动换行(最简单)
FPDF的Cell方法输出内容后,默认会把光标移到当前单元格的右侧;而Ln()方法可以让光标跳到下一行的开头,参数就是你想要的行高。
示例代码:
// 先设置初始的起始位置(比如X=10,Y=50) $pdf->SetXY(10, 50); $rowHeight = 10; // 定义每行的高度,根据你的字体大小调整 while($row = mysqli_fetch_assoc($result)) { // 输出当前行的各个字段 $pdf->Cell(30, $rowHeight, $row['campo1']); $pdf->Cell(30, $rowHeight, $row['campo2']); // 其他字段... // 换行到下一行,行高和Cell的高度保持一致 $pdf->Ln($rowHeight); }
这种方法不需要手动跟踪Y坐标,FPDF会自动帮你管理光标位置,非常省心。
方法2:手动跟踪Y坐标(适合需要精准控制位置的场景)
如果你必须用SetXY来定位,可以在循环里维护一个currentY变量,每次输出后累加行高:
$startX = 10; $startY = 50; $rowHeight = 10; $currentY = $startY; while($row = mysqli_fetch_assoc($result)) { // 定位到当前行的起始位置 $pdf->SetXY($startX, $currentY); // 输出字段 $pdf->Cell(30, $rowHeight, $row['campo1']); $pdf->Cell(30, $rowHeight, $row['campo2']); // 把Y坐标往下移一行的高度,准备下一条记录 $currentY += $rowHeight; // 可选:处理分页(如果记录太多超过一页) if($currentY > 270) { // 假设A4页面的可打印高度是297-27=270(上下边距各27) $pdf->AddPage(); $currentY = $startY; // 新页面回到初始Y位置 } }
方法3:用GetY()获取当前位置(灵活度高)
FPDF提供了GetY()方法,可以获取当前光标所在的Y坐标,这样你不需要手动维护currentY变量:
$pdf->SetXY(10, 50); $rowHeight = 10; while($row = mysqli_fetch_assoc($result)) { $pdf->Cell(30, $rowHeight, $row['campo1']); $pdf->Cell(30, $rowHeight, $row['campo2']); // 获取当前Y坐标,加上行高,设置为下一行的起始位置 $pdf->SetXY(10, $pdf->GetY() + $rowHeight); }
关键提醒
- 行高
$rowHeight要和你Cell方法里的第二个参数保持一致,这样换行的距离才合适,不会出现间距过大或过小的情况。 - 如果你的记录很多,一定要记得添加分页判断,避免内容超出页面范围。
内容的提问来源于stack exchange,提问作者Ing.LuisC
相关产品推荐
相关产品推荐

