You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:17