1、依赖导入

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version></dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency>

poi的依赖是样式设置需要用到

2、自定义水印处理器

package com.XXX.common.utils.easyexcel;import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.XXX.common.exception.CustomException;
import com.XXX.common.utils.SecurityUtils;
import com.XXX.project.system.domain.SysUser;
import lombok.SneakyThrows;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;/*** 添加水印** @author wangchen* @date 2022/11/30 16:07*/
public class CustomWaterMarkHandler implements SheetWriteHandler {public static ByteArrayOutputStream createWaterMark(String content) throws IOException {int width = 300;int height = 150;// 获取bufferedImage对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);String fontType = "微软雅黑";int fontStyle = Font.BOLD;int fontSize = 12;Font font = new Font(fontType, fontStyle, fontSize);// 获取Graphics2d对象Graphics2D g2d = image.createGraphics();image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();//设置字体颜色和透明度,最后一个参数为透明度g2d.setColor(new Color(92, 92, 92, 50));// 设置字体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;}public static void putWaterRemarkToExcel(XSSFSheet sheet, byte[] watermarkBytes) {XSSFWorkbook workbook = sheet.getWorkbook();int watermarkIndex = workbook.addPicture(watermarkBytes, Workbook.PICTURE_TYPE_PNG);String relationId = sheet.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(watermarkIndex)).getRelationship().getId();sheet.getCTWorksheet().addNewPicture().setId(relationId);}@Override@SneakyThrowspublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {if (!(writeSheetHolder.getSheet() instanceof XSSFSheet)) {throw new CustomException("表格必须是XSSFSheet");}SysUser user = SecurityUtils.getLoginUser().getUser();try (ByteArrayOutputStream waterMark = createWaterMark(user.getUserName())) {XSSFSheet sheet = (XSSFSheet) writeSheetHolder.getSheet();putWaterRemarkToExcel(sheet, waterMark.toByteArray());}}
}

3、excel导出工具类

package com.XXX.common.utils.easyexcel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.function.Consumer;/*** ExcelUtils** @author wangchen* @date 2022/11/30 12:22*/
@Slf4j
public class ExcelUtils {/*** 导出数据** @param excelName           excel名字* @param excelWriterConsumer 数据*/public static void excelExport(String excelName, Consumer<ExcelWriter> excelWriterConsumer) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (requestAttributes == null) {return;}HttpServletResponse response = requestAttributes.getResponse();if (response == null) {return;}// 这里注意 有人反应使用swagger 会导致各种问题,请直接用浏览器或者用postmanresponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系try {String fileName = URLEncoder.encode(excelName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 设置水印要将 inMemory 设置为 true ,但是会有OOM的风险ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).inMemory(true).build();excelWriterConsumer.accept(excelWriter);excelWriter.finish();} catch (IOException e) {log.error("", e);}}
}

4、导出示例

 @GetMapping("/exportMonthReview")public void exportOnSelf(MonthlyReview monthlyReview) {List<MonthReviewDto> monthReviewDtos = monthlyReviewService.selectUserDeptMonthReview(monthlyReview);Consumer<ExcelWriter> consumer = excelWriter -> {WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(new CustomWaterMarkHandler()).head(MonthReviewDto.class).build();excelWriter.write(monthReviewDtos, writeSheet);};ExcelUtils.excelExport("结果表", consumer);}

导出事例之所以用这种方式,是考虑到便于excel的sheet页样式设置

5、水印效果图

easyExcel设置水印相关推荐

  1. EasyExcel 实现设置水印(只支持07版Excel文档)

    目录 1 Maven依赖 2 WaterMarkModel 3 CustomWaterMarkHandler 4 调试代码 5 调试结果 注: 1 Maven依赖 <!-- easyExcel ...

  2. php分析图片中水印的位置,关于ThinkPHP打水印及设置水印位置的分析

    这篇文章主要介绍了ThinkPHP打水印及设置水印位置的方法,结合实例形式分析了thinkPHP打印与设置水印的相关操作步骤与具体实现技巧,需要的朋友可以参考下 本文实例讲述了ThinkPHP打水印及 ...

  3. flink 不设置水印_区分理解Flink水印延迟与窗口允许延迟的概念

    link 在开窗处理事件时间(Event Time) 数据时,可设置水印延迟以及设置窗口允许延迟(allowedLateness)以保证数据的完整性.这两者因都是设置延迟时间所以刚接触时容易混淆.本文 ...

  4. Substance风格无法设置水印效果的处理

    今天设置Substance风格时发现使用水印时,withWatermark(...)这个方法没了.网上查了下没有找到答案,到官网查API也没有明确的说明.看源码确实没有这个方法,难道是以前的版本的方法 ...

  5. EasyExcel设置空单元格格式为文本

    EasyExcel设置空单元格格式为文本 导语 解决方式 实现效果 导语 本文是解决空白表格设置格式为文本并不需要表格中有内容,适合导出编写模版的需求.我在网上找了一圈也没具体的解决方案,有很多只能修 ...

  6. easyexcel 设置超链接或附件地址

    easyexcel 设置超链接或附件地址 自定义拦截器 测试方法 结果 自定义拦截器 package com.alibaba.easyexcel.test.demo.write;import java ...

  7. easyexcel设置下拉框并突破255限制

    easyexcel设置下拉框并突破255限制 1:实现接口 要实现SheetWriteHandler接口,在afterSheetCreate方法设置下拉框 import java.util.List; ...

  8. POI easyExcel 设置单元格时间格式的有效性验证

    POI && easyExcel 设置单元格时间格式的有效性验证 设置单元格时间格式的有效性验证示例 // 检查的区域 new CellRangeAddressList(-1, -1, ...

  9. 记录一次 使用easyexcel设置数据有效性

    记录一次 使用easyexcel设置数据有效性 做个备忘 gitee 下载easyexcel easyexcel 纯纯的拉取之后代码 只是在自定义拦截器添加几行代码 WriteTest.java /* ...

最新文章

  1. Android/Java 中线程(Thread)的使用
  2. 有限算法下的技术实现路线
  3. Activity向Fragment传值
  4. 下列关于python的说法中、正确的是-以下关于 Python版本的说法中,哪个是正确的?...
  5. 【ABAP】SAP供应商自定义决裁生成实现
  6. 图论--欧拉回路(模板)
  7. TaskTracker执行map或reduce任务的过程(二)
  8. 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……
  9. Jmeter 及 JDK 下载 安装教程
  10. symbian赛班 系统介绍
  11. 串口termios函数
  12. 微信小程序实现腾讯地图定位功能修改地址功能
  13. 杭州电子科技大学计算机考研复试分数线,2019杭州电子科技大学考研复试分数线通知...
  14. 蚂蚁金服收购印度外卖APP?
  15. 通过cv2.VideoCapture完成跳帧截取视频图片
  16. zcum(浙江中医药)1919: kirito's 星爆气流斩
  17. linux 编译源码,修改未生效
  18. 使用BackTrack来增强电脑的安全
  19. AD导出PDF问题解决办法
  20. 估值冰火两重天 互联网金融巨头“天价”冲刺上市

热门文章

  1. MATLAB提示错误使用network,优化双隐藏神经网络出现错误使用 network/subsasgnne...
  2. 技术干货丨《大天使之剑H5》主程与项目总监:H5游戏的压缩与优化经验
  3. word文件点击打印没反应
  4. ipad协议全新非常稳定
  5. 国外计算机科学的 lab,真滴牛逼!
  6. 闲扯Maven项目代码组织形式
  7. Oracle Database 11g Release 2认证支持的操作系统版本跨度很大
  8. Welearn的cookie值怎么获取?
  9. C++ 计算多边形的面积,计算IOU
  10. 【软考 系统架构设计师】嵌入式系统⑤ 嵌入式系统开发与设计