EasyExcell导出excel添加水印

  • 1、添加easyExcel相关依赖
  • 2、准备基础工具类
  • 3、创建水印handler类
  • 4、创建单元测试类WriteTest.class
  • 5、测试结果

1、添加easyExcel相关依赖

     <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.poi</groupId><version>5.2.2</version><artifactId>poi-ooxml-lite</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>

2、准备基础工具类

DemoData .class

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;
}

TestFileUtil.class

public class TestFileUtil {public static InputStream getResourcesFileInputStream(String fileName) {return Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);}public static String getPath() {return TestFileUtil.class.getResource("/").getPath();}public static File createNewFile(String pathName) {File file = new File(getPath() + pathName);if (file.exists()) {file.delete();} else {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}}return file;}public static File readFile(String pathName) {return new File(getPath() + pathName);}public static File readUserHomeFile(String pathName) {return new File(System.getProperty("user.home") + File.separator + pathName);}
}

3、创建水印handler类

WaterMarkHandler.class水印生成类
EasyExcel提供了一个水印接口类,我们实现SheetWriteHandler自定义我们的水印

@RequiredArgsConstructor
public class WaterMarkHandler implements SheetWriteHandler {private final String WATER_MARK;public static ByteArrayOutputStream createWaterMark(String content) throws IOException {int width = 200;int height = 150;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取bufferedImage对象String fontType = "微软雅黑";int fontStyle = Font.BOLD;int fontSize = 20;Font font = new Font(fontType, fontStyle, fontSize);Graphics2D g2d = image.createGraphics(); // 获取Graphics2d对象image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();g2d.setColor(new Color(0, 0, 0, 20)); //设置字体颜色和透明度,最后一个参数为透明度g2d.setStroke(new BasicStroke(1)); // 设置字体g2d.setFont(font); // 设置字体类型 加粗 大小g2d.rotate(-0.5, (double) image.getWidth() / 2, (double) image.getHeight() / 2);//设置倾斜度FontRenderContext context = g2d.getFontRenderContext();Rectangle2D bounds = font.getStringBounds(content, context);double x = (width - bounds.getWidth()) / 2;double y = (height - bounds.getHeight()) / 2;double ascent = -bounds.getY();double baseY = y + ascent;// 写入水印文字原定高度过小,所以累计写水印,增加高度g2d.drawString(content, (int) x, (int) baseY);// 设置透明度g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));// 释放对象g2d.dispose();ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);return os;}/**为Excel打上水印工具函数@param sheet excel sheet@param bytes 水印图片字节数组*/public static void putWaterRemarkToExcel(SXSSFSheet sheet, byte[] bytes) {//add relation from sheet to the picture dataSXSSFWorkbook workbook = sheet.getWorkbook();XSSFSheet shReflect = (XSSFSheet) ReflectUtil.getFieldValue(sheet, "_sh");int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);XSSFPictureData xssfPictureData = (XSSFPictureData) workbook.getAllPictures().get(pictureIdx);PackagePartName ppn = xssfPictureData.getPackagePart().getPartName();PackageRelationship pr = shReflect.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation(), null);//set background picture to sheetshReflect.getCTWorksheet().addNewPicture().setId(pr.getId());}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@SneakyThrows@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {try (ByteArrayOutputStream waterMark = createWaterMark(WATER_MARK)){SXSSFSheet sheet = (SXSSFSheet) writeSheetHolder.getSheet();putWaterRemarkToExcel(sheet, waterMark.toByteArray());}}
}

4、创建单元测试类WriteTest.class

public class WriteTest {@Testpublic void writer() {String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new WaterMarkHandler("zhangsan")).sheet("模板").doWrite(() -> {// 分页查询数据return data();});}private List<DemoData> data() {List<DemoData> list = ListUtils.newArrayList();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
}

5、测试结果

导出的excel成功添加水印

EasyExcell导出excel添加水印相关推荐

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

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

  2. java 导出excel添加水印

    pom.xml 引入依赖 <!--水印--> <dependency><groupId>org.apache.poi</groupId><arti ...

  3. hutool工具类导出excel添加水印

    // 创建 ExcelWriter 对象 ExcelWriter writer = ExcelUtil.getWriter("demo.xlsx");// 添加水印 ByteArr ...

  4. SpringBoot+POI+JXL实现excel导出并添加水印功能

    SpringBoot+POI+JXL实现excel导出并添加水印功能 1.Pom引入 实现过程,部分代码如下 1.Pom引入 <dependency><groupId>org. ...

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

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

  6. 知识积累:EasyExcel导出Excel带中文水印,中文乱码处理,JDK8 jwt.font中文乱码解决方案

    最近项目中,有个需求是将我们系统导出的Excel增加水印设置. EasyExcel导出带水印Excel类 /*** created by etc.* EasyExcel导出带水印类* @author: ...

  7. POI导出EXCEL带水印 以及单元格格式设置

    客户提个需求,需要将报表导出 excel带水印 和 pdf带水印 2个版本. 做的时候连excel本身怎么带水印都不知道,更不用说用java了.后来在网上搜到了excel添加水印的2个方法. 1.艺术 ...

  8. java struts2 excel上传_Java Struts2 实现数据库数据导出Excel文件

    HTML: 导出 Struts.xml true application/vnd.ms-excel;charset=GBK excelStream attachment;filename=${file ...

  9. Java springMVC POI 导出 EXCEL

    2019独角兽企业重金招聘Python工程师标准>>> 思路 : 将需要导出的数据存放在一个List中 创建一个EXCEL表 注意 XSSFWorkbook 只能操作2007以上的版 ...

最新文章

  1. 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!
  2. 我佛了!用KNN实现验证码识别,又 Get 到一招!
  3. 专家谈计算机体系架构研究获“图灵奖”
  4. C#的加密解密算法,包括Silverlight的MD5算法
  5. kali linux 渗透测试 01 kali介绍
  6. 计算机考研专业课资料,计算机考研专业课资料.doc
  7. 各类木材强度_木材的力学性能
  8. html5g与h5的区别,H5是什么?
  9. linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
  10. 关于界面软件测试点,电子商务网站--界面测试的测试点
  11. 设有n个正整数,将他们连接成一排,组成一个最大的多位整数
  12. 九度搜索引擎点击优化_吉林免费seo优化工具
  13. input验证码框,输入非数字或非12位时,红框提示;每4位加一个空格
  14. 拓端tecdat|python用线性回归预测股票价格
  15. Scratch编程与科学结合-串联与并联
  16. 大数据血缘分析系统设计
  17. 爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
  18. 同时删除多个 PDF 文档最后几页
  19. VMWare安装使用、Linux命令、Docker安装和Linux项目部署
  20. 「可视化搭建系统」——从设计到架构,探索前端领域技术和业务价值

热门文章

  1. Android Studio 虚拟机安装搜狗输入法(实现输入中文)
  2. 苹果系统使用linux内核,iOS操作系统是不是基于Linux呢?
  3. CSAPP读书笔记与习题作业练习-第3章
  4. 更新vs c++2005_2005年8月快速更新
  5. C++每日一题(基础)7、8
  6. 跳一跳python刷分_微信跳一跳不仅可以用python刷分,竟然还可以直接改分
  7. CAD自动保存的文件在哪里?CAD自动保存位置怎么设置
  8. 网络推广从公司起名开始 上海添力张进老师主讲
  9. Windows API Reference for C#, VB.NET
  10. 经典电影里的数学应用