easyPOI生成的excel添加水印

项目场景:

需求要求生成的excel添加水印,这个还是第一次听到,于是研究了一下。


引入依赖

代码如下:

implementation ('cn.afterturn:easypoi-base:4.5.0') {exclude  group: 'com.google.guava', module: 'guava'exclude  group: 'org.apache.commons', module: 'commons-compress'}implementation ('org.apache.poi:ooxml-schemas:1.4')

排除的两个因为对代码没有影响,主要是因为有代码漏洞,排除掉就OK了,但是easy POI引入的apache POI并不全,导致无法添加水印,所以必须要引入org.apache.poi:ooxml-schemas:1.4


代码:

直接上代码了。

@Slf4j
public class ExcelWaterMarkUtil {private ExcelWaterMarkUtil() {}public static void excelWaterMark(Workbook workbook, String append, String username){ByteArrayOutputStream os = null;try {//生成水印图片并导出字节流BufferedImage image = createWatermarkImage(append,username);os = new ByteArrayOutputStream();ImageIO.write(image, "png", os);int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);POIXMLDocumentPart poixmlDocumentPart = (POIXMLDocumentPart) workbook.getAllPictures().get(pictureIdx);//获取每个Sheet表并插入水印for (int i = 0; i < workbook.getNumberOfSheets(); i++) {XSSFSheet sheet1 = (XSSFSheet) workbook.getSheetAt(i);PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();//add relation from sheet to the picture dataPackageRelationship pr = sheet1.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);//set background picture to sheetsheet1.getCTWorksheet().addNewPicture().setId(pr.getId());}} catch (Exception e) {log.error("excel文件添加水印异常",e);}finally {if (os != null){try {os.close();}catch (Exception e){log.error("水印图片字节流关闭异常",e);}}}}private static BufferedImage createWatermarkImage(String append, String username) {Graphics2D g = null;try {Font font = new Font("microsoft-yahei", Font.PLAIN, 20);int width = 300, height = 170;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);g = image.createGraphics();// 背景透明 结束g.setColor(Color.white);g.fillRect(0, 0, width , height);g.setColor(new Color(Integer.parseInt("C5CBCF", 16)));// 设定画笔颜色g.setFont(font);// 设置画笔字体g.shear(0.1, -0.20);// 设定倾斜度//        设置字体平滑g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);String[] textArray = new String[]{ "FRP - " + append, username };int y = 50;for (int i = 0; i < textArray.length; i++) {g.drawString(textArray[i], 0, y);// 画出字符串y = y + font.getSize();}g.drawString(LocalDateTime.now(ZoneId.of(CommonConstant.CHINA_ZONE)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), 0, y);// 画出字符串return image;}finally {g.dispose();// 释放画笔}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NameNode 的 Web 界面

http://127.0.0.1:50070/ 图片显示的是Hadoop的Web界面导航栏。导航栏包含以下选项&#xff1a; Hadoop&#xff1a;Hadoop的主页。Overview&#xff1a;集群的概览信息。Datanodes&#xff1a;数据节点的状态和信息。Datanode Volume Failures&#xff1a;数据节点的卷故障信…

Python——Mixin设计模式

在Python中&#xff0c;Mixin是一种设计模式&#xff0c;它允许通过继承的方式将类的方法&#xff08;或属性&#xff09;混入&#xff08;mixin&#xff09;到其他类中。Mixin主要用于在多个类之间共享代码&#xff0c;特别是当这些类之间并没有直接的继承关系&#xff0c;或者…

Java项目: 基于SpringBoot+mysql旅游网站管理系统分前后台(含源码+数据库+开题报告+PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql旅游网站管理系统分前后台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作…

二叉树展开为列表(LeetCode)

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 解题 clas…

011.Python爬虫系列_bs4解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

尚硅谷Vue入门视频 笔记

尚硅谷视频&#xff1a;https://www.bilibili.com/video/BV1Zy4y1K7SH/?spm_id_from333.999.0.0&vd_sourcecec13bbe100bddfff8baf29d18ed8994 文章目录 模板语法data与el的2种写法MVVM模型事件事件修饰符事件的基本使用 计算属性简写形式 监视属性绑定样式条件渲染列表渲…

C语言回调函数和普通函数的比较

回调函数确实可以用普通函数实现&#xff0c;但它们在某些场景下提供了独特的优势和好处。以下是回调函数的一些主要优势&#xff1a; 1. 灵活性和可扩展性 回调函数允许在运行时动态地选择和调用不同的函数。这使得代码更加灵活和可扩展。例如&#xff0c;在事件驱动的编程中…

vue3+ts+vite+electron+electron-store+electron-builder打包可安装包

yarn create vite yarn add electron yarn add electron-store yarn add electron-builder 新增main.js、preload.js // main.js const { app, BrowserWindow, ipcMain, globalShortcut } require(electron) const path require(path) let store // 我们将在稍后动态导入 el…

关于几道计算机网络题的解答

2017年12月28日&#xff0c;星期四&#xff0c; 照片上的第一题中多项式的指数看不清&#xff0c;但没关系&#xff0c;就现在的情形&#xff0c;说一下大概的思路&#xff0c;参考着再结合题目中实际的参数&#xff0c;再套一遍就能把题目解出来了&#xff0c; 假设&#xf…

raksmart大带宽服务器怎么租

RAKsmart是一个提供大带宽服务器租赁服务的厂商&#xff0c;其机房遍布不同国家与地区如美国、日本、新加坡及韩国等&#xff0c;且有大陆优化和国际BGP两条线路可供选择。Rak小编下面将详细介绍如何租用RAKsmart的大带宽服务器&#xff0c;并提供一些考量因素。 1. 选择机房位…

【软件造价咨询】AI大模型能不能替代软件工程造价师完成软件造价?

当前国内外AI大模型呈现出多样化的发展态势&#xff0c;如由OpenAI开发的自然语言处理大模型GPT系列、由Google开发的基于Transformer的双向编码表示模型BERT、由百度研发的基于飞桨深度学习平台和知识增强大模型文心一言、由阿里研发的多轮对话大模型通义千问、由清华大学计算…

中兴-ZSRV2路由器-任意文件读取

中兴-ZSRV2路由器-任意文件读取 文章目录 中兴-ZSRV2路由器-任意文件读取免责声明漏洞描述搜索语法漏洞复现修复建议 免责声明 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连…

NSSCTF刷题

[NISACTF 2022]checkin 1.在选中nisactf的时候&#xff0c;注释里面的内容也被标记了 2.复制到010editer中发现存在不可见的字符 3.我们选择实际的参名和字符串&#xff0c;并转为url编码格式 4.得到最后的payload&#xff0c;传参得到flag ahahahahajitanglailo&%E2%80%…

uniapp中使用弹出框控制Tab栏区域显示与隐藏

在uniapp中提供控制TabBar的显示与隐藏的函数 uni.hideTabBar() 与 uni.showTabBar() <nut-button block type"primary" click"JDdetail()" >立即接单</nut-button> <---弹出框---> <nut-popup style"z-index: 999;" posi…

windows平台完全卸载visual studio 2022

1. 搜索框输入cmd&#xff0c;以管理员身份运行 2. 在命令行里输入以下指令&#xff08;包含双引号&#xff09;&#xff1a; "C:\Program Files (x86)\Microsoft Visual Studio\Installer\InstallCleanup.exe" 参考官网&#xff1a;解除安裝或移除 Visual Studio…

第十三节:学习Springboot整合mybatis——完整篇(自学Spring boot 3.x的第三天)

大家好&#xff0c;今天记录下学习springboot的第三天。​网创有方 这节详细记录了如何使用springboot整合mybatis方法&#xff0c;并成功实现将请求信息插入本地的mysql数据库。 由于只是为了方便本地验证&#xff0c;实际项目是需要部署到服务器上去的&#xff0c;所以就采用…

开学啦!校园跑腿小程序开发,焕新生活尽在指尖!

随着移动互联网技术的不断发展&#xff0c;校园跑腿小程序成为了高校生活中不可或缺的一部分。无论是代拿快递、代买物品&#xff0c;还是代办各种事务&#xff0c;校园跑腿小程序都能为学生提供极大的便利。 校园内的人群密集&#xff0c;购买东西的需求尤为强烈&#xff0c;…

tornado获取请求参数

在Tornado框架中&#xff0c;获取请求参数&#xff08;包括查询字符串参数、表单数据、JSON数据等&#xff09;可以通过RequestHandler类提供的方法来完成。以下是一些常用的方法来获取不同类型的请求参数&#xff1a; 1. 获取查询字符串参数 查询字符串参数是附加在URL后面的…

2023年中国90后十大影响力人物

“2023年中国90后十大影响力人物” 2024年1月23日&#xff0c;揭晓了由网友投票评选的中国2023年90后十大影响力人物。

每日一练2:两个数组的交集(含链接)

链接&#xff1a; 两个数组的交集_牛客题霸_牛客网 代码&#xff1a; class Solution {public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {bool hash[1001] { };vector<int> ret;for(auto a : nums1){hash[a] tr…