Laravel Excel(maatwebsite):如何将单元格上方图片改为嵌入单元格内?
解决Laravel Excel导出图片悬浮在单元格上方的问题
要将图片从"悬浮在单元格上方"改为"嵌入单元格内",可以通过调整Drawing类的锚点类型、偏移量,同时配合设置单元格的行高列宽来实现,具体修改如下:
1. 修改drawings()方法,设置图片锚点与偏移
在创建Drawing对象后,添加锚点类型设置,让图片随单元格移动和缩放,同时调整偏移量使其贴合单元格内部:
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; public function drawings() { $drawingCollection = []; $row = 2; $column = 'G'; foreach ($this->reportData as $data) { $drawing = new Drawing(); $drawing->setName('MyImage'); $drawing->setDescription('Description'); if($data->{'Foto Toko Depan'}) { $imagePath = storage_path('app/public/' . $data->{'Foto Toko Depan'}); $drawing->setPath($imagePath); $drawing->setHeight(20); $drawing->setWidth(20); $drawing->setCoordinates($column . $row); // 关键:设置锚点类型为随单元格移动和缩放 $drawing->setAnchorType(Drawing::ANCHOR_MOVE_AND_SIZE); // 调整图片在单元格内的偏移量(可选,根据需求调整) $drawing->setOffsetX(3); $drawing->setOffsetY(3); $drawingCollection[] = $drawing; } $row++; } return $drawingCollection; }
2. 设置单元格的行高与列宽
图片嵌入单元格后,需要匹配单元格的大小,避免显示混乱。通过registerEvents()方法添加事件,调整对应列的宽度和每行的高度:
use Maatwebsite\Excel\Events\AfterSheet; public function registerEvents(): array { return [ AfterSheet::class => function(AfterSheet $event) { // 设置G列的宽度(根据图片宽度调整) $event->sheet->getColumnDimension('G')->setWidth(25); // 遍历数据,设置每行的行高(从第2行开始) foreach ($this->reportData as $index => $item) { $rowNum = $index + 2; $event->sheet->getRowDimension($rowNum)->setRowHeight(25); } }, ]; }
原理说明
ANCHOR_MOVE_AND_SIZE锚点类型:让图片与绑定的单元格关联,单元格移动、调整大小时,图片会同步变化,实现"嵌入单元格"的效果。- 偏移量设置:让图片在单元格内留有适当边距,避免紧贴单元格边缘。
- 行高列宽调整:确保单元格大小与图片尺寸匹配,避免图片超出单元格范围。
内容的提问来源于stack exchange,提问作者user12297722
相关产品推荐
相关产品推荐

