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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:27