网络上充斥着各种为excel添加水印的方法,但是多数效果不敢恭维,这里介绍两种添加excel水印的方法,最终实现的效果跟excel工具添加的水印无异,个人比较喜欢比较推荐。
这里说是两种,其实原理是一种,只不过因为poi的版本高低不同,导致了我们的操作发生了变化,大家可以根据自己的poi版本对应选择不同的实现方法。
这两种方法应用的时候是比较久之前了,最近想起来整理一下,可能文章中会有错误,还请口下饶人,有问题我会及时讨论更正。

关于转载说明:

第一种POI比较老的版本中,水印图片绑定参考的资料只记得是一个外国网站,因为时间久远,记不得原始链接了,还请见谅。水印生成工具类参考的是哪个网站也记不清了,求原谅。

第二种是在改造开源项目的时候发现第一种没办法用的情况下借鉴的他人资料,参考的地址为:
https://www.iflym.com/index.php/code/201412280001.html
跟原文有无区别记不太清了,印象里是有改造过,但是终究是借鉴了这篇帖子无疑。

效果图:

水印不会影响到文本的编辑,是真水印,不是重复贴图做成的水印。

生成水印图片的类,两种方法都会用到该类

public class FontImage {@Datapublic static class Watermark {private Boolean enable;private String text;private String dateFormat;private String color;}public static BufferedImage createWatermarkImage(Watermark watermark) {if (watermark == null) {watermark = new FontImage.Watermark();watermark.setEnable(true);
//            watermark.setText("userName");watermark.setText("内部资料");watermark.setColor("#C5CBCF");watermark.setDateFormat("yyyy-MM-dd HH:mm");} else {if (StringUtils.isEmpty(watermark.getDateFormat())) {watermark.setDateFormat("yyyy-MM-dd HH:mm");} else if (watermark.getDateFormat().length() == 16) {watermark.setDateFormat("yyyy-MM-dd HH:mm");} else if (watermark.getDateFormat().length() == 10) {watermark.setDateFormat("yyyy-MM-dd");}if (StringUtils.isEmpty(watermark.getText())) {watermark.setText("内部资料");}if (StringUtils.isEmpty(watermark.getColor())) {watermark.setColor("#C5CBCF");}}String[] textArray = watermark.getText().split("\n");Font font = new Font("microsoft-yahei", Font.PLAIN, 20);Integer width = 300;Integer height = 100;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 背景透明 开始Graphics2D g = image.createGraphics();image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g.dispose();// 背景透明 结束g = image.createGraphics();g.setColor(new Color(Integer.parseInt(watermark.getColor().substring(1), 16)));// 设定画笔颜色g.setFont(font);// 设置画笔字体g.shear(0.1, -0.26);// 设定倾斜度//        设置字体平滑g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);int y = 50;for (int i = 0; i < textArray.length; i++) {g.drawString(textArray[i], 0, y);// 画出字符串y = y + font.getSize();}g.drawString(DateUtils.getNowDateFormatCustom(watermark.getDateFormat()), 0, y);// 画出字符串g.dispose();// 释放画笔return image;}
}

第一种,基于POI的老版本

pom文件中添加以下依赖

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.0</version></dependency>

java核心代码

try {XSSFWorkbook workbook = new XSSFWorkbook();FileOutputStream out = new FileOutputStream("/Users/Tony/Downloads/out.xls");XSSFSheet sheet = workbook.createSheet("Sheet1");workbook.getSheet("Sheet1");//add picture data to this workbook.
//                FileInputStream is = new FileInputStream("/Users/Tony/Downloads/data_image.png");
//            byte[] bytes = IOUtils.toByteArray(is);BufferedImage image = FontImage.createBufferedImage("科技有限公司", new Font("microsoft-yahei", Font.PLAIN, 20), 300, 100, true);// 导出到字节流BByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
//            is.close();//add relation from sheet to the picture dataString rID = sheet.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();//set background picture to sheetsheet.getCTWorksheet().addNewPicture().setId(rID);workbook.write(out);} catch (Exception e) {e.printStackTrace();}

第二种,基于POI的高版本

pom文件中添加以下依赖

该方法中用不用的到ooxml-schemas依赖记不清了,可以删除尝试下

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.0</version></dependency>

java核心代码

BufferedImage image = FontImage.createBufferedImage("科技有限公司", new Font("microsoft-yahei", Font.PLAIN, 20), 300, 100, true);// 导出到字节流BByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);XSSFWorkbook workbook = new XSSFWorkbook(is);int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表XSSFSheet sheet = workbook.getSheetAt(i);PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();//add relation from sheet to the picture dataPackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);//set background picture to sheetsheet.getCTWorksheet().addNewPicture().setId(pr.getId());}workbook.write(response.getOutputStream());

java POI为excel添加水印相关推荐

  1. Java - Poi 操作 Excel

    Java - Poi 操作 Excel 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 注意 XSSFWorkbook 对象是操作 .xlsx 格式的表格 HS ...

  2. 利用java poi对excel表的读写操作

    2019独角兽企业重金招聘Python工程师标准>>> 利用java poi对excel表的读写操作 POI简介: Apache POI是一种流行的API,它允许程序员使用Java程 ...

  3. java poi 导出excel不能超过65536行

    java poi 导出excel不能超过65536行 报这个异常 Exception in thread "main" java.lang.IllegalArgumentExcep ...

  4. java POI创建Excel示例(xslx和xsl区别 )

    Java用来处理office类库有很多,其中POI就是比较出名的一个,它是apache的类库,现在版本到了3.10,也就是2014年2月8号这个版本. 在处理PPT,Excel和Word前,需要导入以 ...

  5. poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel

    java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...

  6. Java POI 对Excel合并单元格的数据处理

    Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求. Excel工具类 ...

  7. Java poi操作Excel单元格样式

    Java poi设置Excel单元格格式设置 XSSFWorkbook xwb = new XSSFWorkbook();或者 XSSFWorkbook xwb = new XSSFWorkbook( ...

  8. JAVA POI通用Excel导入模板

    JAVA POI通用Excel导入模板 Excel导入模板类 Excel导入模板类 package com.golte.dataform.analysis.controller;import com. ...

  9. java poi对Excel表格进行单元行删除

    java poi对Excel表格进行单元行删除 前几天工作时,突然需要去使用POI 来对Excel 表格进行操作,其他的操作都都没什么问题,但是在需要删除某些单元行的时候碰到了一下小坑,记录下来,防止 ...

  10. java poi读取excel报错Your InputStream was neither an OLE2 stream, nor an OOXML stream

    错误描述 java poi读取excel报错Your InputStream was neither an OLE2 stream, nor an OOXML stream 楼主是读取的另存为的exc ...

最新文章

  1. 老男孩Python全栈开发(92天全)视频教程 自学笔记20
  2. 【Linux 内核】调度器 ③ ( sched_class 调度类结构体分析 | next 字段 | enqueue_task 函数 | dequeue_task 函数 )
  3. shared_ptr和weak_ptr使用介绍
  4. 算法专题(1)-信息学基本解题流程!
  5. java给定_Java – 在给定示例中使用super()
  6. LAMP(7限定某个目录禁止解析php、 限制user_agent、 PHP相关配置、PHP扩展模块
  7. 深度学习工具caffe详细安装指南
  8. PHP中文乱码解决办法
  9. php mysql 查询缓存_mysql 查询缓存使用详解
  10. git提交后的代码在哪儿_git 分支合并策略
  11. 指针用作函数参数、指针型函数和函数指针
  12. OS X 终端修改备忘录
  13. winpcapp配置c++网口通讯_PLC通讯智能网关,不用编程,实现西门子与罗克韦尔(AB)、三菱等PLC之间通讯...
  14. 8.Docker技术入门与实战 --- 使用Dockerfile创建镜像
  15. 光环PMP:超凡IT经理人的“六重修炼”专题讲座
  16. Apache Spark源码剖析
  17. fastboot刷机工具_红魔3/3S 刷机教程
  18. Spring Security整合KeyCloak保护Rest API
  19. vue 手机h5动态银行支付密码键盘前端
  20. 2021运营App推广必备的几款工具

热门文章

  1. 如何将时间字体LED化(类似电子表)显示
  2. 大浪淘沙-新浪发展的秘密
  3. 使用GPS和velodyne 64拼接地图
  4. C#学习笔记五——选择文件、文件夹操作
  5. 基于树莓派的智能门禁及3D外壳打印设计
  6. xml文件中servlet映射重复问题,也是导致tomcat启动不了,出现在Java 9上运行时,需在JVM命令行参数中添加“-add opens=Java.base/Java.lang=ALL-U
  7. 浅谈vocaloid3基础操作
  8. 机器学习:Kmeans聚类算法总结及GPU配置加速demo
  9. 向死而生的微信视频号,逆风翻盘的2020
  10. Ant Design for vue