使用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
相关产品推荐
相关产品推荐

