Laravel8使用maatwebsite/excel3.1导出多列PDF被截断 能否用水平滚动解决
解决方案
1. 调整页面配置适配更多列
在你现有的AfterSheet事件中补充以下配置,可以大幅提升单页可容纳的列数:
AfterSheet::class => function (AfterSheet $event) { // 原有横向配置 $event->sheet->getPageSetup()->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE); // 1. 更换更大的纸张尺寸,可选值还有PAPERSIZE_A2_PAPER等更大规格 $event->sheet->getPageSetup()->setPaperSize(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::PAPERSIZE_A3); // 2. 开启宽度自适应:所有列压缩适配到1页宽度,页面高度不做限制 $event->sheet->getPageSetup()->setFitToWidth(1); $event->sheet->getPageSetup()->setFitToHeight(0); // 3. 缩小页边距,减少页面留白空间 $event->sheet->getPageMargins()->setTop(0.5); $event->sheet->getPageMargins()->setBottom(0.5); $event->sheet->getPageMargins()->setLeft(0.3); $event->sheet->getPageMargins()->setRight(0.3); // 4. 全局缩小字体+开启内容自动换行,减少列宽占用 $event->sheet->getStyle($event->sheet->calculateWorksheetDimension()) ->getFont() ->setSize(9); $event->sheet->getStyle($event->sheet->calculateWorksheetDimension()) ->getAlignment() ->setWrapText(true); },
2. 手动控制列宽
你当前引入了ShouldAutoSize接口自动计算列宽,部分场景下自动计算的列宽冗余较大,可以去掉该接口,通过WithColumnWidths手动设置更小的列宽:
public function columnWidths(): array { return [ 'A' => 8, 'B' => 12, // 逐个设置所有列的宽度,根据实际内容调整数值即可 ]; }
3. 拆分列分组导出
如果列数实在太多,上述适配效果仍不理想,可以把列按业务关联性拆分成多组,导出为同一个PDF的多个工作表,或者多个独立PDF文件,每个文件仅展示部分列,避免内容截断。
关于水平滚动的说明
PDF是固定页面布局的格式,原生为打印场景设计,不存在水平滚动的原生实现。如果需要支持水平滚动查看完整表格,建议直接导出Excel格式文件,或者转为HTML表格格式导出,浏览器天然支持HTML表格的水平滚动操作。
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

