首先需求是用户提出导出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 poi 水印_java解决poi导出excel文字水印,导出excel不可操作问题相关推荐

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

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

  2. java自动生成生成java透视表_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

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

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

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

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

  5. Java,图片添加二维码和文字水印,合并为一张图

    在工作中遇到了要把两张图片合并成一张图片的情况,具体场景是用户头像➕二维码➕背景图 本着不重复造轮子的想法,搜索了hutool的utils包,还真让我找到了一个cn.hutool.core.img.I ...

  6. matlab提excel文字,matlab读取excel文字

    数据导入| 将excel数据导入matlab_计算机软件及应用_IT/计算机_专业资料.将 excel 数据导入 matlab 一. 将 excel 文本放在 matlab 的 work 文件夹里面. ...

  7. android水印控件,Android图片添加文字水印并保存水印文字图片到指定文件

    Android图片添加文字水印并保存水印文字图片到指定文件package zhangphil.test;import android.graphics.Bitmap;import android.gr ...

  8. java poi 空_Java的poi技术遍历Excel时进行空Cell,空row,判断

    /** * 导入信息 */ @Override public List add(HttpServletRequest request) { // TODO Auto-generated method  ...

  9. java poi 换行_Java利用POI生成Excel强制换行

    前一段时间在做一个学校排课系统时,有一个地方需要利用把课程表生成excel汇出给客户,由于之前用excel都只是简单的应用,在单元格里都是用自动换行,而这次可能需要用到手动强制换行. 于是我在网上找了 ...

  10. poi导出自定义文字水印excel文件

    直接上代码 注意Workbook和sheet都是XSSF开头的这种,水印效果是整个sheet页铺满自定义文本水印 import javax.imageio.ImageIO; import java.a ...

最新文章

  1. 流程控制关键字——跳转结构
  2. std::shared_ptr
  3. 除了CRUD也要注意IO
  4. 大数据技术 学习之旅_为什么聚焦是您数据科学之旅的关键
  5. iQOO Neo5搭载66W超快闪充:30分钟回血!
  6. 苹果针对FaceTime内的4个iOS漏洞提出更新
  7. flask+uwsgi 在调试过程中让python文件的更改自动重启uwsgi
  8. linux的多任务编程-线程池,Linux的多任务编程-线程池
  9. Jekyll搭建lanmps.com站点
  10. linux lasound.so教程,Linux ALSA 音频系统:逻辑设备篇(示例代码)
  11. 动手学习深度学习——基本简介
  12. 快看这里,豆瓣9.0的Python爬虫宝藏书籍,自学爬虫必备~
  13. 智多星骗子行为让人发指
  14. UE4过场动画的制作流程
  15. 水仙花数的判断(JAVA)
  16. HBuildx项目运行到小程序出现下面提示
  17. Linux基础系列修炼---笔记1
  18. 解决sql注入问题(丛林战争项目)
  19. 使用R语言包clusterProfiler做KEGG富集分析时出现的错误及解决方法
  20. 从autojs到冰狐智能辅助的心里历程

热门文章

  1. Android平台压缩纹理ETC2 VS ASTC
  2. 手动揪出电脑中毒导致的空间自动发广告的元凶
  3. Python numpy.ones_like函数方法的使用
  4. 极米科技非“极客”:研发多年未掌握核心科技,还向竞品购买专利
  5. mac转换pin计算机,MAC对应PIN码表-2012.3.4整理
  6. pentaho安装mysql驱动_在Pentaho数据集成中安装MySQL JDBC驱动
  7. 4类官网原型设计及模板奉上,助你创意泉涌!
  8. word 2010中页码从任意页开始
  9. 调用百度云短语音合成简单程序
  10. python 正则findall右斜杠_Python正则表达式匹配反斜杠问题解析