导出Excel添加水印

[复制链接]
发表于 2022-10-12 16:52:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
需求背景:
  要求导出的Excel有水印,且水印不要是可点击的图片影响正常操作。
开发环境:
  JDK 1.8
  SpringBoot v2.2.5.RELEASE
导入依赖:
  1. 1
  2. 2         <dependency>
  3. 3             <groupId>org.apache.poi</groupId>
  4. 4             <artifactId>poi</artifactId>
  5. 5             <version>3.8</version>
  6. 6         </dependency>
  7. 7         <dependency>
  8. 8             <groupId>org.apache.poi</groupId>
  9. 9             <artifactId>poi-ooxml</artifactId>
  10. 10             <version>3.8</version>
  11. 11         </dependency>
  12. 12         <dependency>
  13. 13             <groupId>org.apache.poi</groupId>
  14. 14             <artifactId>ooxml-schemas</artifactId>
  15. 15             <version>1.0</version>
  16. 16         </dependency>
复制代码
 
 
demo样例:
  1. private void makeExcelWithWaterMark(){
  2.     // todo 生成Excel代码
  3.     setWaterMarkToExcel(workbook,createWatermarkImage(null));
  4.     // todo 生成文件、输出流代码
  5. }
复制代码
设置为Excel设置水印
  1. 1 public static void setWaterMarkToExcel(XSSFWorkbook workbook, BufferedImage bfi) throws Exception {
  2. 2     ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
  3. 3     ImageIO.write(bfi, "png", byteArrayOut);
  4. 4     int pictureIdx = workbook.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);
  5. 5     //add relation from sheet to the picture data
  6. 6     POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);
  7. 7     for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
  8. 8         XSSFSheet xssfSheet = workbook.getSheetAt(i);
  9. 9         PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
  10. 10         String relType = XSSFRelation.IMAGES.getRelation();
  11. 11         PackageRelationship pr = xssfSheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
  12. 12         xssfSheet.getCTWorksheet().addNewPicture().setId(pr.getId());
  13. 13     }
  14. 14 }
复制代码
创建水印方法
  1. 1 public static BufferedImage createWatermarkImage(WaterMarkContent watermark) {
  2. 2         if (watermark == null) {
  3. 3             watermark = new WaterMarkContent();
  4. 4             watermark.setEnable(true);
  5. 5             watermark.setText("水印内容");
  6. 6             watermark.setColor("#C5CBCF");
  7. 7             watermark.setDateFormat("yyyy-MM-dd HH:mm");
  8. 8         }
  9. 9         String[] textArray = watermark.getText().split(",");
  10. 10         Font font = new Font("microsoft-yahei", Font.PLAIN, 20);
  11. 11         Integer width = 300;
  12. 12         Integer height = 100;
  13. 13
  14. 14         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  15. 15         // 背景透明 开始
  16. 16         Graphics2D g = image.createGraphics();
  17. 17         image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
  18. 18         g.dispose();
  19. 19         // 背景透明 结束
  20. 20         g = image.createGraphics();
  21. 21         // 设定画笔颜色
  22. 22         g.setColor(new Color(Integer.parseInt(watermark.getColor().substring(1), 16)));
  23. 23         // 设置画笔字体
  24. 24         g.setFont(font);
  25. 25         // 设定倾斜度
  26. 26         g.shear(0.1, -0.26);
  27. 27
  28. 28         // 设置字体平滑
  29. 29         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  30. 30
  31. 31         int y = 50;
  32. 32         for (int i = 0; i < textArray.length; i++) {
  33. 33             // 画出字符串
  34. 34             g.drawString(textArray[i], 0, y);
  35. 35             y = y + font.getSize();
  36. 36         }
  37. 37         // 画出字符串
  38. 38         g.drawString("2022-10-12 11:24:00", 0, y);
  39. 39         // 释放画笔
  40. 40         g.dispose();
  41. 41         return image;
  42. 42     }
复制代码
 
 
 
一般情况下,只需要根据需求修改创建水印方法中第5行、第7行、第38行代码setText、setDateFormat、g.drawString方法的第一个参数即可
若要生成多行水印,在setText中用【,】(英文逗号)进行分隔。也可以修改第9行分隔字符,进行分隔。
 
 
 
导出后样式如图

 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表