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

使用FPDF创建固定列数、行数不等的表格问题求助

解决FPDF创建不等行数3列表格的问题

看起来你当前的代码逻辑没走对,没法让不同行数的列正确对齐——问题出在你没有按行逐列绘制内容,反而把每列的内容单独堆叠,还硬写了固定的Y坐标,这肯定达不到预期效果。

我来给你调整下函数逻辑,核心思路是先找到所有列里的最大行数,然后逐行绘制每一列的单元格:某列在当前行有内容就显示,没有就留空,这样就能保证每一行的单元格都对齐了。

修正后的MyTable函数

function MyTable($header, $data){ 
    $w = array(63, 63, 63); 
    $rowHeight = 8; // 自定义每行高度,可根据字体大小调整

    // 绘制表头
    for($i=0;$i<count($header);$i++) {
        $this->Cell($w[$i], $rowHeight, $header[$i], 1, 0, 'L'); 
    }
    $this->Ln($rowHeight);

    // 计算所有列中最多的行数,确定表格总行数
    $maxRows = 0;
    foreach($data as $col) {
        if(count($col) > $maxRows) {
            $maxRows = count($col);
        }
    }

    // 逐行绘制表格内容
    for($rowIdx=0; $rowIdx<$maxRows; $rowIdx++) {
        foreach($data as $colIdx => $col) {
            // 若当前列有对应行的内容则显示,否则留空
            $content = isset($col[$rowIdx]) ? $col[$rowIdx] : '';
            $this->Cell($w[$colIdx], $rowHeight, $content, 1, 0, 'L');
        }
        $this->Ln($rowHeight);
    }
}

关键改动说明

  • 新增$rowHeight变量,统一控制每行高度,后续调整字体或行间距时更灵活
  • 先计算所有列的最大行数$maxRows,明确表格需要绘制的总行数
  • 外层循环按行索引遍历,内层循环逐列处理:检查当前列在该行是否有内容,有则填充,无则留空
  • 每行绘制完成后用Ln($rowHeight)准确定位到下一行起始位置,彻底解决坐标错乱问题

调用代码(无需修改)

$pdf = new PDF(); 
$pdf->AliasNbPages(); 
$pdf->AddPage(); 
$pdf->SetFont('Times','',16); 
$header = array('Alergije','Hronicne bolesti','Rizici'); 
$data = array(array('Penicilin','Latex'),array('Hipertenzija','Dijabetes','Secer'),array('Rizik 1','Rizik 2','Rizik 3','Rizik 4')); 
$pdf->MyTable($header,$data); 
$pdf->Output();

运行后你会看到:表格3列对齐,第三列的4个内容占满4行,前两列在第4行显示为空,完全符合你要的“各行行数不同但列对齐”的效果。

如果后续需要处理长文本自动换行,可以把Cell替换为MultiCell,同时需要动态计算每行的最大高度来适配内容,不过针对你当前的短文本场景,上面的代码完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:39