easyexcel实现导出添加文字水印

打印 上一主题 下一主题

主题 929|帖子 929|积分 2787

引入jar包

由于easyexcel没有引入ooxml-schemas包,所以需要额外添加。
  1. <dependency>
  2.     <groupId>com.alibaba</groupId>
  3.     <artifactId>easyexcel</artifactId>
  4.     <version>2.2.6</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.apache.poi</groupId>
  8.     <artifactId>ooxml-schemas</artifactId>
  9.     <version>1.4</version>
  10. </dependency>
  11. <dependency>
  12.     <groupId>cn.hutool</groupId>
  13.     <artifactId>hutool-all</artifactId>
  14. </dependency>
复制代码
新增水印配置类和WriteHandler

新增水印配置类
  1. @Data
  2. public class Watermark {
  3.     /**
  4.      * 水印内容
  5.      */
  6.     private String content = "";
  7.     /**
  8.      * 画笔颜色. eg:#C5CBCF
  9.      */
  10.     private String color = "#C5CBCF";
  11.     /**
  12.      * 字体颜色
  13.      */
  14.     private Font font = new Font("microsoft-yahei", Font.PLAIN, 20);
  15.     /**
  16.      * 水印宽、高
  17.      */
  18.     private int width = 300;
  19.     private int height = 100;
  20.     /**
  21.      * 倾斜度
  22.      */
  23.     private double shear1 = 0.1;
  24.     private double shear2 = -0.26;
  25.     /**
  26.      * 字体的y轴位置
  27.      */
  28.     private int yAxis = 50;
  29. }
复制代码
新增WriteHandler

注意:此方法只适用于XSSFWorkbook类,easyexcel默认使用的是SXSSFWorkbook类,在使用easyexcel导出时需要设置为inMemory模式,否则会抛出类型转换异常。
  1. public class CustomWaterMarkHandler implements SheetWriteHandler {
  2.     private final Watermark watermark;
  3.     public CustomWaterMarkHandler(Watermark watermark) {
  4.         this.watermark = watermark;
  5.     }
  6.     @Override
  7.     public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  8.     }
  9.     @Override
  10.     public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  11.         try {
  12.             BufferedImage bufferedImage = createWatermarkImage();
  13.             setWaterMarkToExcel((XSSFWorkbook) writeWorkbookHolder.getWorkbook(), bufferedImage);
  14.         } catch (Exception e) {
  15.             throw new RuntimeException("添加水印出错");
  16.         }
  17.     }
  18.     private BufferedImage createWatermarkImage() {
  19.         final Font font = watermark.getFont();
  20.         final int width = watermark.getWidth();
  21.         final int height = watermark.getHeight();
  22.         String[] textArray = watermark.getContent().split(",");
  23.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  24.         // 背景透明 开始
  25.         Graphics2D g = image.createGraphics();
  26.         image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
  27.         g.dispose();
  28.         // 背景透明 结束
  29.         g = image.createGraphics();
  30.         // 设定画笔颜色
  31.         g.setColor(new Color(Integer.parseInt(watermark.getColor().substring(1), 16)));
  32.         // 设置画笔字体
  33.         g.setFont(font);
  34.         // 设定倾斜度
  35.         g.shear(watermark.getShear1(), watermark.getShear2());
  36.         // 设置字体平滑
  37.         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  38.         int y = watermark.getYAxis();
  39.         for (String s : textArray) {
  40.             // 从画框的y轴开始画字符串.假设电脑屏幕中心为0,y轴为正数则在下方
  41.             g.drawString(s, 0, y);
  42.             y = y + font.getSize();
  43.         }
  44.         // 释放画笔
  45.         g.dispose();
  46.         return image;
  47.     }
  48.     private void setWaterMarkToExcel(XSSFWorkbook workbook, BufferedImage bfi) {
  49.         //将图片添加到工作簿
  50.         int pictureIdx = workbook.addPicture(ImgUtil.toBytes(bfi, ImgUtil.IMAGE_TYPE_PNG), Workbook.PICTURE_TYPE_PNG);
  51.         //建立 sheet 和 图片 的关联关系
  52.         XSSFPictureData xssfPictureData = workbook.getAllPictures().get(pictureIdx);
  53.         for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
  54.             XSSFSheet xssfSheet = workbook.getSheetAt(i);
  55.             PackagePartName packagePartName = xssfPictureData.getPackagePart().getPartName();
  56.             PackageRelationship packageRelationship = xssfSheet.getPackagePart()
  57.                     .addRelationship(packagePartName, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation(), null);
  58.             //添加水印到工作表
  59.             xssfSheet.getCTWorksheet().addNewPicture().setId(packageRelationship.getId());
  60.         }
  61.     }
  62. }
复制代码
测试
  1. //水印配置
  2. Watermark watermark = new Watermark();
  3. watermark.setContent("测试文字水印");
  4. watermark.setWidth(500);
  5. watermark.setHeight(200);
  6. watermark.setYAxis(200);
  7. //导出
  8. EasyExcel.write(outputStream, Test.class)
  9.         .inMemory(true)
  10.         .sheet("sheet1")
  11.         .registerWriteHandler(new CustomWaterMarkHandler(watermark))
  12.         .doWrite(Collections.singletonList(new Test()));
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表