Laravel 9中使用Maatwebsite给Excel添加水印问题求助
图片背景水印实现
你当前代码添加的是浮在内容上方的普通图片,要做成背景水印,需调整图片的尺寸、层级和位置,让它覆盖整个工作表并置于底层:
use Maatwebsite\Excel\Events\AfterSheet; use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; class myExport implements FromView, WithEvents, WithDrawings { public function view(): View { return view('report'); } public function drawings() { $drawing = new Drawing(); $drawing->setName('Background Watermark'); $drawing->setDescription('Draft Watermark'); $drawing->setPath(public_path('assets/img/draft.png')); // 设置图片尺寸为覆盖工作表(可按需调整) $drawing->setWidth(800); $drawing->setHeight(600); // 定位到左上角,无偏移 $drawing->setCoordinates('A1'); $drawing->setOffsetX(0); $drawing->setOffsetY(0); // 设置层级为底层(0为最低层级,避免遮挡内容) $drawing->setOrder(0); return [$drawing]; } // 可选:自动适配工作表大小 public function registerEvents(): array { return [ AfterSheet::class => function(AfterSheet $event) { $sheet = $event->sheet->getDelegate(); $maxColumn = $sheet->getHighestColumn(); $maxRow = $sheet->getHighestRow(); // 根据工作表范围调整图片尺寸 $sheet->getDrawingCollection()[0]->setWidth($sheet->getColumnDimension($maxColumn)->getWidth() * 10); $sheet->getDrawingCollection()[0]->setHeight($sheet->getRowDimension($maxRow)->getRowHeight() * $maxRow); }, ]; } }
文字水印实现
如果不需要图片,直接用文字做水印,可通过WithEvents的AfterSheet事件添加艺术字,设置透明度、旋转和位置:
use Maatwebsite\Excel\Events\AfterSheet; use PhpOffice\PhpSpreadsheet\Style\Color; use PhpOffice\PhpSpreadsheet\Worksheet\Shape; class myExport implements FromView, WithEvents { public function view(): View { return view('report'); } public function registerEvents(): array { return [ AfterSheet::class => function(AfterSheet $event) { $sheet = $event->sheet->getDelegate(); // 创建文字形状 $shape = $sheet->createShape(); $shape->setShapeType(Shape::SHAPE_TEXTBOX); $shape->setName('Watermark'); $shape->setWidth(300); $shape->setHeight(100); // 定位到工作表中心位置(可按需调整) $shape->setOffsetX(200); $shape->setOffsetY(150); // 设置文字旋转角度 $shape->setRotation(30); // 设置半透明填充 $shape->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID); $shape->getFill()->getStartColor()->setARGB('77000000'); // 前两位为透明度,77代表半透明 // 设置文字内容与样式 $shape->getText()->createTextRun('DRAFT'); $shape->getText()->getFont()->setSize(36); $shape->getText()->getFont()->setColor(new Color(Color::COLOR_BLACK)); // 置于底层避免遮挡内容 $shape->setOrder(0); }, ]; } }
注意事项
- 图片水印需确保
public_path('assets/img/draft.png')路径正确,图片文件存在。 - 文字水印的位置、大小、旋转角度可根据实际需求调整参数。
- 无论哪种方案,建议使用浅色/半透明效果,避免遮挡表格内容。
内容的提问来源于stack exchange,提问作者kasfik
相关产品推荐
相关产品推荐

