前言

首先致敬以下我参考的博客 https://www.jianshu.com/p/4332f5feab2e
最近接到一个所谓给导出文件excel加水印的需求,但是一番搜索百度之后意识到一个现实:excel没有水印的概念,强行要加水印的话只能是给文件加图片,但是加图片有两种:

  • 往表格里贴透明图片,这个很智障,会严重干扰正常阅读和操作
  • 设置文件背景图;
    接下来就比较明了了,其实就是给excel加一个背景图,但是问题就麻烦在java中基本没有这么干过的,可用方案很少,有spire公司提供的方案,但是这是一个授权付费方案,团队应该是不愿为这个小需求付钱的。最终还是考虑使用poi原生支持
    但是poi原生也只能是XSSFWorkbook这种实现能够支持,如果项目是用别的实现生成excel的话,需要改写组装excel文件内容这部分代码,使用xssfworkbook, xssfsheet。
  • 具体的背景图添加也有两种方案(不同的poi版本依赖有些区别),说到这里,贴一下用到的两组不同依赖。
  •  <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.0</version></dependency>
    

这种方式对应的背景图加载方法为

 public static void setWaterMarkToExcel2(XSSFWorkbook workbook, BufferedImage bfi) throws Exception {ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();ImageIO.write(bfi, "png", byteArrayOut);int pictureIdx = workbook.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);//add relation from sheet to the picture dataPOIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);for (int i = 0; i < workbook.getNumberOfSheets(); i++) {XSSFSheet xssfSheet = workbook.getSheetAt(i);PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();PackageRelationship pr = xssfSheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);xssfSheet.getCTWorksheet().addNewPicture().setId(pr.getId());}}

对应的背景图BufferedImage生成方法也贴一下

public static BufferedImage createWatermarkImage(WaterMarkContent watermark) {if (watermark == null) {watermark = new WaterMarkContent();watermark.setEnable(true);
//            watermark.setText("userName");watermark.setText("内部资料");watermark.setColor("#C5CBCF");watermark.setDateFormat("yyyy-MM-dd HH:mm");}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.currentStringDate(), 0, y);// 画出字符串g.dispose();// 释放画笔return image;}

WaterMarkContent 就是一个普通的实体类,放了几个字段,自行根据需要处理就好

  • 第二种依赖导入为
  •  <dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency>
    

我分析可能是ooxml-schemas版本差异,用这个版本的话要使用另外一种方式

    public static void setWaterMarkToExcel2(XSSFWorkbook workbook, XSSFSheet sheet, BufferedImage bfi) throws Exception {ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();ImageIO.write(bfi, "png", byteArrayOut);int pictureIdx = workbook.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);//add relation from sheet to the picture dataString rID = sheet.addRelation(null, XSSFRelation.IMAGE_PNG, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();//set background picture to sheetsheet.getCTWorksheet().addNewPicture().setId(rID);}

可能出现的异常:
java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook$Factoryat
这种情况可能是ooxml-schemas依赖版本的问题,我碰到时是从1.4换成1.0就好了,对了我的jdk版本是1.7,也有小伙伴碰到了采用更换jdk版本到1.8也能解决好像。
就写到这里吧,这个需求感觉没有多少实际需求,excel水印,呵呵,还是叫excel文件添加背景图吧

Java语言为excel添加水印,使用原生POI, (XSSFWorkbook, XSSFSheet), 真正背景图水印效果,非普通图片张贴相关推荐

  1. linux java excel文件_使用Java语言将excel中读取到的内容导入Linux的文件中

    一.maven配置 导入excel表格需要使用的依赖: org.apache.poi poi 4.0.0 org.apache.poi poi-ooxml 4.0.0 二.测试程序 package u ...

  2. js判断定时器是否启动_原生js如何做出轮播图的效果

    <div class="box"><ul><li class="active"><img src="./im ...

  3. android水印添加水印,android 增加背景文字 水印效果(仿钉钉)

    [实例简介] [实例截图] [核心代码] package com.example.nurmemet.watermark; import android.graphics.Color; import a ...

  4. java ssh 下载excel,SSH整合WEB导出EXCEL案例

    基于Spring,Struts2,Hibernate整合, jsp页面导出(下载)excel文件的简单应用 1)本例不采用Java任何导出excel文件常用的poi或者jxl 等第三方jar包,仅仅基 ...

  5. 零基础学Java语言---编程题

    零基础学Java语言-编程题 注意:没有上机实际测过,代码仅供参考 1.温度转换 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示 ...

  6. EasyExcel导出添加水印(设置背景,非插入图片的方式)

    引言 本文添加水印通过java生成图片,设置为excel背景图片实现.不仅仅局限于EasyExcel,凡是采用POI实现都可以采用该方案,但唯一的局限在于必须使用POI中的XSSFWorkbook对象 ...

  7. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  8. Java为 pdf、word和excel添加水印

    1. 引入依赖 <!--easyexcel--><dependency><groupId>com.alibaba</groupId><artifa ...

  9. Java - 导出Excel添加水印、密码

    需求: 导出excel时,添加操作人的用户名.手机号水印.文件密码.基于若依框架的excel导出工具类改造,有三种添加水印方式,此处仅做一个记录. 目录 一. 添加依赖 二.工具类 1.水印处理类 2 ...

最新文章

  1. vuex之state-状态对象的获取方法(三)
  2. 【问题解决】ESP32 Brownout detector was triggered,log报错Brownout解决方法
  3. 判断一个数是否是回文数
  4. 6 岁!是时候重新认识下 Serverless 了
  5. sklearn 安装_初识sklearn
  6. .NET Core中使用结果过滤器ResultFilter统一结果返回封装
  7. PHP遍历数组的几种方法
  8. 11.m进制转十进制
  9. java 链接重排序_JAVA中JVM的重排序详细介绍
  10. 【ES】学习5-全文搜索
  11. SpringBoot中修改tomcat最大连接数、最大线程数、最大等待数
  12. 编程语言python入门-Python基础教程 - 全文
  13. 论文阅读笔记(六)——GhostNet: More Features from Cheap Operations
  14. spark性能调优05-troubleshooting处理
  15. 为解决WINDOWS JRE启动外壳,找了好几个方案
  16. 安装vs2017出现闪退现象_win7安装vs2017时闪退
  17. 企业信息系统战略规划
  18. c语言城市交通灯优化,城市智能交通灯系统(本科)毕业论文.doc
  19. ac3168无线网卡驱动下载_REALTEK芯片无线网卡最新驱动!支持到10.15
  20. python获取当前时间戳_Python获取时间戳代码实例

热门文章

  1. 华为服务器rh-2286远程控制无法使用
  2. python的matplotlib绘图(双坐标轴)
  3. 洛谷P4598 解高次方程,数论
  4. 计算机ei期刊最新版2018,2018年EI收录中文期刊目录
  5. JAVA使用HttpURLConnection请求HTTPS网站,不需要证书验证的DEMO教程
  6. Ubuntu下编译VeraCrypt
  7. 虚拟机终端输入sudo的密码时,无法输入密码
  8. 百度智能云落子贵阳,工业互联网进入新赛段
  9. TCP原理之:linux网桥
  10. Redis详解之特殊数据类型GEO及底层数据结构