easyExcel添加背景水印
参考:https://www.jianshu.com/p/4332f5feab2e
1、添加水印所需的jar包
<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><exclusions><!--去掉poi-xmlbeans的依赖,使其与easyexcel中的版本一致 --><exclusion><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId></exclusion></exclusions><version>1.4</version>
</dependency>
2、编写水印策略
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.RequiredArgsConstructor;
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;@RequiredArgsConstructor
public class WaterMarkStrategy implements SheetWriteHandler {private final String WATER_MARK;public static ByteArrayOutputStream createWaterMark(String content) throws IOException {int width = 180;int height = 90;// 获取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 g2d = image.createGraphics(); // 获取Graphics2d对象image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();//设置字体颜色和透明度,最后一个参数为透明度g2d.setColor(new Color(236, 88, 104, 80));// 设置字体 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(XSSFSheet sheet, byte[] bytes) {XSSFWorkbook workbook = sheet.getWorkbook();int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);String rID = sheet.addRelation(null, XSSFRelation.IMAGES, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();//设置背景图片----关键代码sheet.getCTWorksheet().addNewPicture().setId(rID);}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@SneakyThrows@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {try (ByteArrayOutputStream waterMark = createWaterMark(WATER_MARK)) {XSSFSheet sheet = (XSSFSheet) writeSheetHolder.getSheet();putWaterRemarkToExcel(sheet, waterMark.toByteArray());}}}
3、easyExcel导出时,添加水印策略
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);String contentStr = WebUtil.getCurrentUser(request).getChineseName().concat(" ").concat(DateTime.now().toString("yyyy-MM-dd HH:mm"));ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(out);if ("1".equals(watermarkSwitch)) {//excel添加水印,只支持XSSFWorkbook。 easyExcel使用时需要设置inMemory(true),否者默认使用的是SXSSFWorkbook,会报错!excelWriterBuilder.inMemory(true).registerWriteHandler(new WaterMarkStrategy(contentStr));}excelWriter = excelWriterBuilder.registerWriteHandler(horizontalCellStyleStrategy)//自动设置列宽度.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).head(excelHead).build();
4、效果图如下:
easyExcel添加背景水印相关推荐
- JS 添加背景水印(适用于 PC 端和移动端)
前言 因为这个看网上已经有很多的案例了,所以我就简单的记录一下,方式都是大差不差的. 正文 JS 调用示例,参数配置可自己调节,适用于移动端和PC端 调用方法:watermark({ watermar ...
- php生成背景并加字,PHP给图片添加文字水印实例
PHP给图片添加文字水印实例,支持中文文字水印,是否覆盖原图,自定义设置水印背景色.文字颜色.字体等. 水印类water.class.php var $Path = "./"; / ...
- echarts添加背景图片,背景色及水印
2022-1-9学习记录 添加背景图 遇到的问题: 添加本地图片为背景图片时不显示图片 解决: 在templates同级目录下创建一个static目录,将图片文件放置此文件夹内即可 法一: 在div标 ...
- 如何用SpreadJS添加背景图片和水印?
SpreadJS是一个面向企业级应用开发的综合性.高效能的基于HTML5的纯JavaScript的电子表格控件.SpreadJS有着强大的表单处理能力和电子表格功能.这些功能包括跨表单引用和计算,这样 ...
- 快速给视频添加背景和水印的步骤
前几天有几个剪辑视频的小伙伴们来问,有没有批量给视频添加背景和水印的简单操作,这不,今天就给大家安排上,下面就来教大家给视频批量添加背景和水印的小技巧. 在这里我们会用到一个叫[固乔剪辑助手]的软件, ...
- 如何使用PowerPoint在幻灯片背景中添加DRAFT水印?
使用PowerPoint如何在幻灯片背景中添加DRAFT水印?使用PowerPoint你可以快速轻松地创建.编辑.查看.演示或共享演示文稿,但是PowerPoint没有像Word那样的现成水印库,但您 ...
- php加图片源码_PHP添加文字水印或图片水印的水印类完整源代码与使用示例
PHP实现的给图片添加水印功能,可添加文字水印或图片水印,使用文字水印时需要提供字体文件,使用图片水印时需要提供水印图片,水印图片不能比要添加水印的图片大,请使用背景透明的水印图片. 该水印类支持自定 ...
- c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
早上,一哥儿发来添加图片水印的资料.有三个信息,如下: xx 09:57:35 http://index.cnblogs.com/archive/2004/10/20/544 ...
- c#程序设计教程 唐大仕pdf_C# 添加PDF水印
概述 一般我们在向文档添加水印时,会分为直接添加文字水印和加载图片添加图片水印两种情况.常见的,在添加文字水印时会多以声明文档版权.权威性的文字.标语或者名称等:同样的,图片水印也通常可以是某组织的L ...
- 盒马员工因工资单意外被同事看到,遭强制开除;微博被传大面积裁员、员工被要求主动离职,官方否认;豆瓣在截图中添加盲水印|雷峰早报...
微博回应大面积裁员:调整部分组织架构 2月19日,微博上了脉脉App热搜,在"传微博正在优化员工"的话题中,有经过职位信息认证的微博员工表示,微博正在大面积裁员,有的员工还被要求主 ...
最新文章
- 【高并发】又一个朋友面试栽在了Thread类的stop()方法和interrupt()方法上!
- 针对淡入淡出的定时轮播效果js
- python 仪表盘数据显示_跟小白学Python数据分析——绘制仪表盘
- hosts和resolv.conf区别
- 11-直接内存 Direct Memory
- SET ARITHABORT ON 对UI的影响
- SlimYOLOv3:更窄、更快、更好的无人机目标检测算法
- web developer tips (29):在web应用项目里启用“编辑并继续”功能
- 文档服务器备份吗,本地资料和云服务器备份吗
- FFmpeg源代码简单分析:avformat_find_stream_info()
- as 怎么将多个cpp文件代码编译成so_你编写的Java代码是咋跑起来的?
- Java web切面编程
- css 垂直居中_当面试官问起CSS布局之水平垂直居中时~~
- ussd代码大全_魅族ussd补电代码 | 手游网游页游攻略大全
- HDU6070(线段树)
- origin2018 柱状图_学术干货 | 科研人请收藏—Origin画出双Y轴柱状图
- Flash Video DRM 视频版权保护技术
- 现代公司制度的法理学基础 (贾登勋 王勇)
- 数据结构:单链表中在P结点前插入S结点
- 压缩机的 压缩比、内容积比、内压力比概念你不要搞混淆了