首先需求是用户提出导出excel数据需使用水印备注其用途;

其实就是在导出excel的同时带有自定义文字水印的导出。

那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出excel有没有相关技术可以直接导出文字水印,可想而知我写了这篇博客,当然是没有一步走成的方法

那么我们开始换一种思路,大家都知道图片可以添加文字水印和图片水印,那么既然图片可以添加文字水印,可能就可以想到excel可以导出图片的功能。那么我们可以先创建一个透明色的图片,然后添加文字水印,最后添加到excel中导出,结束,那么我们直接来看实现

首先看一下如何生成有文字水印的透明色图片

/*** 生成背景透明的 文字水印,文字位于透明区域正中央,可设置旋转角度

*

*@paramwidth 生成图片宽度

*@paramheigth 生成图片高度

*@paramtext 水印文字

*@paramcolor 颜色对象

*@paramfont awt字体

*@paramdegree 水印文字旋转角度

*@paramalpha 水印不透明度0f-1.0f*/

public static BufferedImage waterMarkByText(int width, intheigth, String text, Color color,

Font font, Double degree,floatalpha) {

BufferedImage buffImg= newBufferedImage(width, heigth, BufferedImage.TYPE_INT_RGB);/**2、得到画笔对象*/Graphics2D g2d=buffImg.createGraphics();//---------- 增加下面的代码使得背景透明 -----------------

buffImg =g2d.getDeviceConfiguration().createCompatibleImage(width, heigth, Transparency.TRANSLUCENT);

g2d.dispose();

g2d=buffImg.createGraphics();//---------- 背景透明代码结束 -----------------//设置对线段的锯齿状边缘处理

g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);//设置水印旋转

if (null !=degree) {//注意rotate函数参数theta,为弧度制,故需用Math.toRadians转换一下//以矩形区域中央为圆心旋转

g2d.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);

}//设置颜色

g2d.setColor(color);//设置 Font

g2d.setFont(font);//设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));//计算绘图偏移x、y,使得使得水印文字在图片中居中//这里需要理解x、y坐标是基于Graphics2D.rotate过后的坐标系

int x = -width / 3;int y = -heigth / 2;//字体长度

int markWidth = font.getSize() *getTextLength (text);//字体高度

int markHeight =font.getSize();//循环添加水印

while (x < width * 1.5) {

y= -heigth / 2;while (y < heigth * 1.5) {

g2d.drawString (text, x, y);

y+= markHeight + 200;

}

x+= markWidth + 200;

}//取绘制的字串宽度、高度中间点进行偏移,使得文字在图片坐标中居中//释放资源

g2d.dispose();return buffImg;

然后在原来的导出文件方法中添加用来获取已经添加文字的透明色图片

/*** 生成导出文件

*@paramsheetName

*@paramdataItems

*@paramcolumnKeys

*@paramcolumnNames

*@throwsIOException*/

public static void initExportFileToWb(HSSFWorkbook wb,String sheetName,List> dataItems,List columnKeys,List columnNames,String waterText) throwsIOException {

HSSFSheet sheet=wb.createSheet(sheetName);//设置安全性密码

sheet.protectSheet(UUID.randomUUID().toString());

HSSFRow row= sheet.createRow(0);

row.setHeight((short) 500);//学生信息excel//初始化头部

initHeader(wb,sheet,columnNames);//初始化数据

initData(sheet, dataItems, columnKeys,columnNames);//根据导出列数计算图片的宽度 153和17是写定的,大家看情况

int width = columnNames.size()*153;//根据导出数据计算图片的高度

int height = (dataItems.size()+2)*17;//获取有文字水印的透明色图片

BufferedImage water =CommonUtils.getWaterImage(width,height,waterText);

导入图片

putWaterRemarkToExcel(wb,sheet,water,20,40);

}

最后就是导出excel时插入图片

/*** 为Excel打上水印工具函数

* 请自行确保参数值,以保证水印图片之间不会覆盖。

* 在计算水印的位置的时候,并没有考虑到单元格合并的情况,请注意

*@paramwb Excel Workbook

*@paramsheet 需要打水印的Excel

*@paramwaterRemarkPath 水印地址,classPath,目前只支持png格式的图片,

* 因为非png格式的图片打到Excel上后可能会有图片变红的问题,且不容易做出透明效果。

* 同时请注意传入的地址格式,应该为类似:"\\excelTemplate\\test.png"

*@paramwaterRemarkWidth 水印图片宽度为多少列

*@paramwaterRemarkHeight 水印图片高度为多少行

*@throwsIOException*/

public static voidputWaterRemarkToExcel(HSSFWorkbook wb,HSSFSheet sheet, BufferedImage waterRemarkPath,int waterRemarkWidth, int waterRemarkHeight) throwsIOException{//加载图片

ByteArrayOutputStream byteArrayOut = newByteArrayOutputStream();if(null ==waterRemarkPath) {throw new RuntimeException("向Excel上面打印水印,读取水印图片失败(2)。");

}

ImageIO.write(waterRemarkPath,"png",byteArrayOut);//开始打水印

Drawing drawing =sheet.createDrawingPatriarch();/** 参数定义:

* 第一个参数是(x轴的开始节点);

* 第二个参数是(是y轴的开始节点);

* 第三个参数是(是x轴的结束节点);

* 第四个参数是(是y轴的结束节点);

* 第五个参数是(是从Excel的第几列开始插入图片,从0开始计数);

* 第六个参数是(是从excel的第几行开始插入图片,从0开始计数);

* 第七个参数是(图片宽度,共多少列);

* 第8个参数是(图片高度,共多少行);*/ClientAnchor anchor= drawing.createAnchor(0, 0, 255, 255, 0, 0, waterRemarkWidth, waterRemarkHeight);

Picture pic=drawing.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG));

pic.resize();

}

完成后查看导出excel结果

最后既然是水印,当然该文件不可操作,可通过设置查看密码进行限制,限制如图

// 设置安全性密码,随机的谁也不知道sheet.protectSheet(UUID.randomUUID().toString());

最后:如果上传到服务器水印文字无法正常显示

复制C盘Windows/Fonts下字体到项目,然后使用该字体,获取到改字体创建后要设置字体大小

font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(request.getSession().getServletContext().getRealPath("/template/simsun.ttc")));

font = font.deriveFont(Font.ROMAN_BASELINE,32);

完美解决!第一次写博客有问题大家多多指教,谢谢!

完成该需求参考了:

java导出excel水印_java解决poi导出excel文字水印,导出excel不可操作问题相关推荐

  1. jsp text 水印_java实现图片上加文字水印(SpringMVC + Jsp)

    看之前要先对SpringMVC进行了解打好基础,下面直接先看效果图 代码编写 1.导入相关架包 2.配置文件 web.xml watermarkspringmvc dispatcherServlet ...

  2. java poi 读取excel 编码_Java使用POI 读取和写入Excel指南

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求:网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0. ...

  3. java 读取ppt文件_java使用poi读取ppt文件和poi读取excel、word示例

    Apache的POI项目可以用来处理MS Office文档,codeplex上还有一个它的.net版本.POI项目可创建和维护操作各种基于OOXML和OLE2文件格式的Java API.大多数MS O ...

  4. java excel 电话号码_java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来...

    为了防止数字变成科学计数法方式表示,在源文件以及java代码中都用文的方式去生成和解回析excel,具体答如下: 生成Excel时,设置单元格格式为STRING,即: //关键代码 HSSFCell  ...

  5. Java poi api插入文字水印到docx文件

    使用apache poi api实现wps插入水印效果. Office Open XML介绍 Microsoft Office从2007版开始使用xml格式存储.zip解压一个docx的word文档后 ...

  6. java 在线 excel文件_Java实现最简单的在线打开保存Excel文件 - PageOffice

    Java实现最简单的在线打开保存Excel文件- PageOffice 在项目开发过程中,经常会涉及到生成Excel报表,但往往系统只能通过后台生成Excel报表并保存到服务器上,若想在系统中打开Ex ...

  7. java给图片加水印_Java 为图片添加水印(图片水印,文字水印)

    Java 为图片添加水印(图片水印,文字水印) 2014-07-28·WeaponX 5267 次浏览 ```java import java.awt.Color; import java.awt.F ...

  8. java水印_Java实现给图片添加图片水印,文字水印及马赛克的方法示例

    本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印 ...

  9. java将数据转为pdf并添加图片、文字水印(表格样式)超简易模式

    pdf预览.导出.文字.图片水印(表格样式) 用到的maven依赖 <!-- pdf --> <dependency><groupId>com.itextpdf&l ...

  10. java word添加图片_Java 替换word文档文字并指定位置插入图片

    先说下 需要的依赖包 org.apache.poi poi-excelant 3.12 org.apache.poi poi-scratchpad 3.12 org.apache.poi poi-oo ...

最新文章

  1. golang install/build 生成的文件命名和路径
  2. 【模型解读】network in network中的1*1卷积,你懂了吗
  3. 第三篇.python编辑器和集成环境01
  4. 【渝粤教育】国家开放大学2018年秋季 0630-22T环境法学 参考试题
  5. 信息安全工程师笔记-网络攻击常见技术
  6. PAT-Travel Plan (30)-Dijkstra和SPFA
  7. 开放 接口 饿了么_饿了么口碑启动生态赋能计划 将在210城开放智慧餐厅业务合作窗口...
  8. mac 下载appium
  9. h5 如何录音保存上传_html5 网页录音、试听以及上传
  10. 2022京东618预售一般多久才发货啊?几天能收到货?
  11. 玩一玩Android下载框架
  12. AI之AutoML:autosklearn/Auto-Sklearn(基于scikit-learn库的自动化的机器学习工具)的简介、安装、使用方法之详细攻略
  13. Opencv Surf特征实现图像无缝拼接生成全景图像(三)
  14. 乌云安全所有资料(百度云打包)pdf
  15. 如何查看Adobe illustrator链接了哪里的资源,查看文件路径
  16. java毕业设计社团管理系统mybatis+源码+调试部署+系统+数据库+lw
  17. 运维之道 | Nginx 配置文件优化解析
  18. 利用SVM小样本机械故障诊断(MATLAB代码)
  19. [软考]信息安全工程师-第6章 认证技术原理与应用 课件知识点整理
  20. 如何更好的学习计算机知识

热门文章

  1. 项目管理和产品立项流程图
  2. 白鹭游戏引擎网络棋牌搭建步骤
  3. android 截屏源码分析,Android新姿势:截屏代码整理
  4. Matlab画柱状图和饼状图以及横纵坐标设置,宽度设置等
  5. 哈工大本部2022形式语言与自动机期末试题
  6. win10怎样更改系统字体_掌阅F1系统设置及字体更改、水墨屏阅读软件、打卡必备软件...
  7. 先学python还是r-r语言和python学哪个?
  8. 一文搞懂单片机驱动8080LCD
  9. 7个顶级静态代码分析工具
  10. 文通车牌识别 SDK