从MySQL读取数据生成PDF时单元格文本无法换行的解决方案求助
解决MySQL数据插入PDF时单元格文本溢出的问题
看起来你遇到的是FPDF中Cell()方法不支持自动换行的问题——默认情况下,Cell()只会在一行内显示文本,一旦内容长度超过单元格宽度,就会溢出边界。要实现文本在单元格内自动换行,我们需要改用MultiCell()方法,它专门处理需要换行的文本内容,同时保持表格的整齐布局。
具体解决方案
首先,我们用MultiCell()替代原来的Cell()来处理orders和addons这类可能过长的字段,同时通过坐标定位确保同一行的所有单元格对齐:
include 'restaurantconnect.php'; $count=0; $sql="SELECT * FROM `restaurant`"; $result = $conn->query($sql); // 确保字体已设置(如果之前没初始化的话) $pdf->SetFont('Arial','',12); while($inventory = $result->fetch_assoc()){ $concat = $inventory['first_name'] . " " . $inventory['last_name']; // 保存当前行的起始坐标,用于后续定位 $startX = $pdf->GetX(); $startY = $pdf->GetY(); // 第一个单元格:food_id(右对齐) $pdf->MultiCell(25, 5, $inventory['food_id'], 1, 'R', false); $pdf->SetXY($startX + 25, $startY); // 定位到下一个单元格 // 第二个单元格:姓名(居中对齐) $pdf->MultiCell(50, 5, $concat, 1, 'C', false); $pdf->SetXY($startX + 25 + 50, $startY); // 第三个单元格:package(左对齐) $pdf->MultiCell(20, 5, $inventory['package'], 1, 'L', false); $pdf->SetXY($startX + 25 + 50 + 20, $startY); // 第四个单元格:orders(自动换行,可选:把逗号换成换行符优化显示) $ordersText = str_replace(',', "\n", $inventory['orders']); $pdf->MultiCell(100, 5, $ordersText, 1, 'L', false); $pdf->SetXY($startX + 25 + 50 + 20 + 100, $startY); // 第五个单元格:addons(自动换行,结束当前行) $addonsText = str_replace(',', "\n", $inventory['addons']); $pdf->MultiCell(70, 5, $addonsText, 1, 'L', false); // 调整下一行的起始位置,确保行高足够容纳最长的文本 $maxLines = max(substr_count($ordersText, "\n") + 1, substr_count($addonsText, "\n") + 1); $requiredHeight = 5 * $maxLines; if($pdf->GetY() < $startY + $requiredHeight){ $pdf->SetY($startY + $requiredHeight); } }
关键说明
MultiCell()参数:依次是单元格宽度、每行高度、显示文本、边框样式、对齐方式、是否填充背景。它会自动将文本在指定宽度内换行,并且根据文本行数调整单元格高度。- 坐标定位:用
GetX()/GetY()获取当前光标位置,再用SetXY()将光标移到下一个单元格的起始位置,避免因MultiCell自动换行导致的单元格错位。 - 优化显示:把
orders字段里的逗号替换成换行符,让每个菜品单独占一行,阅读起来更清晰。
这样修改后,orders和addons的内容就会在各自的单元格内自动换行,不会再溢出边界了。
内容的提问来源于stack exchange,提问作者Ellis Cristoph
相关产品推荐
相关产品推荐

