TCPDF表格列数据显示异常求助:双表数据无法分栏展示
解决TCPDF中两表数据分列显示问题
问题根源
你当前的代码逻辑是先完整输出checklist表的所有键值对,每输出一项就换行,导致TCPDF的文本光标始终停在第一列的行位置;后续处理checklist_notez时,所有Cell都会继续在第一列输出,完全偏离了预期的第二列位置。
修复方案
先将两个表的数据分别整理成独立的键值对数组,然后按行同步输出两列内容:每行先输出第一列的对应项(无内容则填空单元格),再输出第二列的对应项,确保每一行的两列内容在同一行显示。
修改后的完整代码
<?php require_once('tcpdf.php'); include('config.php'); if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['reg_number'])) { $reg_number = mysqli_real_escape_string($link, $_POST['reg_number']); // Fetch data from checklist $checklistSql = "SELECT * FROM checklist WHERE reg_number = '$reg_number'"; $checklistResult = mysqli_query($link, $checklistSql); if (!$checklistResult) { die("Error fetching checklist data: " . mysqli_error($link)); } // Fetch data from checklist_notez $noteSql = "SELECT * FROM checklist_notez WHERE reg_number2 = '$reg_number'"; $noteResult = mysqli_query($link, $noteSql); if (!$noteResult) { die("Error fetching checklist_notez data: " . mysqli_error($link)); } // 整理checklist数据为键值对数组 $checklistItems = []; while ($checklistRow = mysqli_fetch_assoc($checklistResult)) { foreach ($checklistRow as $key => $value) { if ($key !== 'reg_number' && $key !== 'reg_number2') { // 排除主键/关联字段 $checklistItems[] = $key . ': ' . $value; } } } // 整理checklist_notez数据为键值对数组 $noteItems = []; while ($noteRow = mysqli_fetch_assoc($noteResult)) { foreach ($noteRow as $key => $value) { if ($key !== 'reg_number' && $key !== 'reg_number2') { // 排除主键/关联字段 $noteItems[] = $key . ': ' . $value; } } } // Create PDF instance $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->AddPage(); $pdf->SetFont('times', 12); // Display headers $pdf->Cell(70, 10, 'Checklist', 1); $pdf->Cell(70, 10, 'Checklist_notez', 1); $pdf->Ln(); // 取两个数组的最大行数,确保所有内容都能输出 $maxRows = max(count($checklistItems), count($noteItems)); // 逐行输出两列内容 for ($i = 0; $i < $maxRows; $i++) { // 输出第一列内容,无则填空 $checklistContent = isset($checklistItems[$i]) ? $checklistItems[$i] : ''; $pdf->Cell(70, 10, $checklistContent, 1); // 输出第二列内容,无则填空 $noteContent = isset($noteItems[$i]) ? $noteItems[$i] : ''; $pdf->Cell(70, 10, $noteContent, 1); // 换行到下一行 $pdf->Ln(); } // Close the result sets mysqli_free_result($checklistResult); mysqli_free_result($noteResult); // Close the database connection mysqli_close($link); // Output the PDF as a download $pdfFileName = 'combined_checklist_' . $reg_number . '.pdf'; $pdf->Output($pdfFileName, 'D'); // 'D' to force download } ?>
额外说明
- 代码中增加了排除
reg_number/reg_number2字段的逻辑,避免无关的关联字段出现在PDF中; - 通过
max(count(...))确保两个列的行数对齐,不会出现某列提前结束的情况; - 每行严格先输出第一列、再输出第二列,完全符合你预期的分栏显示效果。
内容的提问来源于stack exchange,提问作者mohaabed
相关产品推荐
相关产品推荐

