easyExcel添加背景水印

参考:https://www.jianshu.com/p/4332f5feab2e

1、添加水印所需的jar包

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
        <exclusions>
            <!--去掉poi-xmlbeans的依赖,使其与easyexcel中的版本一致 -->
            <exclusion>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
            </exclusion>
         </exclusions>
     <version>1.4</version>
</dependency>

2、编写水印策略

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;


@RequiredArgsConstructor
public class WaterMarkStrategy implements SheetWriteHandler {

    private final String WATER_MARK;

    public static ByteArrayOutputStream createWaterMark(String content) throws IOException {
        int width = 180;
        int height = 90;
        // 获取bufferedImage对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        String fontType = "微软雅黑";
        int fontStyle = Font.BOLD;
        int fontSize = 12;
        Font font = new Font(fontType, fontStyle, fontSize);
        Graphics2D g2d = image.createGraphics(); // 获取Graphics2d对象
        image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        g2d.dispose();
        g2d = image.createGraphics();
        //设置字体颜色和透明度,最后一个参数为透明度
        g2d.setColor(new Color(236, 88, 104, 80));
        // 设置字体 
        g2d.setStroke(new BasicStroke(1));
        // 设置字体类型  加粗 大小
        g2d.setFont(font);
        //设置倾斜度 
        g2d.rotate(-0.5, (double) image.getWidth() / 2, (double) image.getHeight() / 2);
        FontRenderContext context = g2d.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(content, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = -bounds.getY();
        double baseY = y + ascent;
        // 写入水印文字原定高度过小,所以累计写水印,增加高度
        g2d.drawString(content, (int) x, (int) baseY);
        // 设置透明度
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        // 释放对象
        g2d.dispose();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(image, "png", os);
        return os;
    }


    /**
     * 为Excel打上水印工具函数
     *
     * @param sheet excel sheet
     * @param bytes 水印图片字节数组
     */
    public static void putWaterRemarkToExcel(XSSFSheet sheet, byte[] bytes) {
        XSSFWorkbook workbook = sheet.getWorkbook();
        int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
        String rID = sheet.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(pictureIdx))
                .getRelationship().getId();
        //设置背景图片----关键代码
        sheet.getCTWorksheet().addNewPicture().setId(rID);
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    @SneakyThrows
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        try (ByteArrayOutputStream waterMark = createWaterMark(WATER_MARK)) {
            XSSFSheet sheet = (XSSFSheet) writeSheetHolder.getSheet();
            putWaterRemarkToExcel(sheet, waterMark.toByteArray());
        }
    }

}

3、easyExcel导出时,添加水印策略

       // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
            String contentStr = WebUtil.getCurrentUser(request).getChineseName().concat(" ").concat(DateTime.now().toString("yyyy-MM-dd HH:mm"));
            ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(out);
            if ("1".equals(watermarkSwitch)) {
                //excel添加水印,只支持XSSFWorkbook。 easyExcel使用时需要设置inMemory(true),否者默认使用的是SXSSFWorkbook,会报错!
                excelWriterBuilder.inMemory(true)
                        .registerWriteHandler(new WaterMarkStrategy(contentStr));
            }
            excelWriter = excelWriterBuilder.registerWriteHandler(horizontalCellStyleStrategy)
                    //自动设置列宽度
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .head(excelHead).build();

4、效果图如下:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
EasyExcel是一个开源的Java库,用于读写Excel文件。如果您想要在生成的Excel文件中添加自定义水印,可以使用EasyExcel的扩展插件机制来实现。 以下是添加自定义水印插件的步骤: 1. 创建一个实现了com.alibaba.excel.write.handler.WriteHandler接口的自定义水印处理器类。该接口包含了beforeSheetCreate和afterSheetCreate两个方法,分别在创建Sheet之前和之后调用。可以在这些方法中添加自定义的水印。 例如下面是一个添加水印的处理器类: ```java public class WaterMarkHandler implements WriteHandler { private String watermark; public WaterMarkHandler(String watermark) { this.watermark = watermark; } @Override public void beforeSheetCreate(String sheetName, int sheetIndex) { // no-op } @Override public void afterSheetCreate(String sheetName, int sheetIndex) { Sheet sheet = EasyExcel.writerSheet(sheetIndex, sheetName) .build() .getSheet(); // 在Sheet中添加水印 Drawing<?> drawing = sheet.createDrawingPatriarch(); // 创建文字方块 ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 3, 3); anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE); // 创建水印文字 RichTextString watermarkText = new XSSFRichTextString(watermark); watermarkText.applyFont(watermarkFont()); // 在文字方块中添加水印文字 drawing.createTextbox(anchor).setString(watermarkText); } private Font watermarkFont() { Font font = new Font("宋体", Font.BOLD, 20); font.setColor(IndexedColors.GREY_50_PERCENT.getIndex()); return font; } } ``` 2. 创建一个实现了com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder接口的自定义工作簿处理器类。该接口包含了beforeWorkbookCreate和afterWorkbookCreate两个方法,分别在创建Workbook之前和之后调用。可以在这些方法中添加自定义的水印处理器。 例如下面是一个添加水印处理器的工作簿处理器类: ```java public class WaterMarkWorkbookHandler implements WriteWorkbookHolder { private String watermark; public WaterMarkWorkbookHandler(String watermark) { this.watermark = watermark; } @Override public void beforeWorkbookCreate() { // no-op } @Override public void afterWorkbookCreate(WriteWorkbookHolder writeWorkbookHolder) { // 获取Workbook对象 Workbook workbook = writeWorkbookHolder.getWorkbook(); // 创建水印处理器 WriteHandler waterMarkHandler = new WaterMarkHandler(watermark); // 注册水印处理器 ((SXSSFWorkbook) workbook).registerWriteHandler(waterMarkHandler); } } ``` 3. 在生成Excel文件时使用自定义工作簿处理器类。 例如下面是一个使用自定义工作簿处理器类的示例: ```java public static void main(String[] args) { // 创建ExcelWriter对象 String filename = "test.xlsx"; ExcelWriter excelWriter = EasyExcel.write(filename) .withTemplate("template.xlsx") .build(); // 设置自定义工作簿处理器 WriteWorkbookHolder waterMarkWorkbookHandler = new WaterMarkWorkbookHandler("自定义水印"); excelWriter.setWriteWorkbookHolder(waterMarkWorkbookHandler); // 写入数据 List<User> userList = Arrays.asList( new User("张三", 20), new User("李四", 25), new User("王五", 30) ); excelWriter.write(userList, EasyExcel.writerSheet().build()); // 关闭ExcelWriter对象 excelWriter.finish(); } ``` 在上面的示例中,我们创建了一个ExcelWriter对象,并设置了自定义工作簿处理器为WaterMarkWorkbookHandler。然后向Excel文件中写入数据并关闭ExcelWriter对象。在关闭ExcelWriter对象时,自定义工作簿处理器会自动添加到生成的Excel文件中。 通过以上步骤,就可以在使用EasyExcel生成Excel文件时添加自定义水印插件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值