当前位置: 首页 > news >正文

使用java代码给Excel加水印,代码全,进阶版

以下代码,亲测可以跑通
1、上一篇博客用了Apache POI库3.8的版本的形式对Excel加了水印,但是最近主线版本用了4.1.2的形式,由于为了保持版本的兼容性,下面有开发了Apache POI的4.1.2的版本号的方案。
pom文件为:

 <dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version></dependency></dependencies>

测试类及主要 功能代码:

package com.msl;import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;import static java.awt.image.BufferedImage.TYPE_INT_ARGB;public class ExcelWatermark0905 {public static void main(String[] args) {// 输入Excel文件路径//   String inputFile = "/Users/navyliu/Downloads/input/附件2-3:企业资产转让业务尽职调查报告(申请机构_业务部门填写)1.xlsx";//  String inputFile = "/Users/navyliu/Downloads/input/kxkj.xlsx";// String inputFile = "/Users/navyliu/Downloads/input/test.xlsx";String inputFile = "/Users/navyliu/Downloads/input/315.xlsx";// 输出Excel文件夹路径String outputFolder = "/Users/navyliu/Downloads/output";// 水印文字String watermarkText = "我是水印文字";try {FileInputStream fis = new FileInputStream(inputFile);XSSFWorkbook workbook = new XSSFWorkbook(fis);// 设置文本和字体大小Font font = new Font("宋体",Font.PLAIN,36);
//            XXSFont font = workbook.createFont();
//            font.setFontName("仿宋");
//            font.setFontHeightInPoints((short) 20);int height = 467;int width = 987;BufferedImage watermarkImage = drawText(watermarkText, font, Color.orange, Color.white, height, width);ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();ImageIO.write(watermarkImage, "png", byteArrayOut);int pictureIdx = workbook.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);for (int i = 0; i < workbook.getNumberOfSheets(); i++) {XSSFSheet  xssfSheet =  workbook.getSheetAt(i);String rID = xssfSheet.addRelation(null, XSSFRelation.IMAGE_PNG, workbook.getAllPictures().get(pictureIdx)).getRelationship().getId();//set background picture to sheetxssfSheet.getCTWorksheet().addNewPicture().setId(rID);}// 保存带水印的Excel到输出文件夹File outputDir = new File(outputFolder);if (!outputDir.exists()) {outputDir.mkdirs();}String outputFilePath = outputFolder + "/output2.xlsx";FileOutputStream fos = new FileOutputStream(outputFilePath);workbook.write(fos);fos.close();fis.close();} catch (IOException e) {e.printStackTrace();}}private static BufferedImage drawText(String text, Font font, Color textColor, Color backColor, double height, double width) {BufferedImage img = new BufferedImage((int) width, (int) height, TYPE_INT_ARGB);Graphics2D loGraphic = img.createGraphics();FontMetrics loFontMetrics = loGraphic.getFontMetrics(font);int liStrWidth = loFontMetrics.stringWidth(text);int liStrHeight = loFontMetrics.getHeight();loGraphic.setColor(backColor);loGraphic.fillRect(0, 0, (int) width, (int) height);loGraphic.translate(((int) width - liStrWidth) / 2, ((int) height - liStrHeight) / 2);loGraphic.rotate(Math.toRadians(-45));loGraphic.translate(-((int) width - liStrWidth) / 4, -((int) height - liStrHeight) / 4);loGraphic.setFont(font);loGraphic.setColor(textColor);loGraphic.drawString(text, ((int) width - liStrWidth) / 4, ((int) height - liStrHeight) / 2);loGraphic.drawString(text, ((int) width - liStrWidth) / 2, ((int) height - liStrHeight) / 4);loGraphic.drawString(text, ((int) width - liStrWidth) / 6, ((int) height - liStrHeight) / 20);loGraphic.dispose();return img;}
}

执行后的结果截图:
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/155446.html

相关文章:

  • day37:网编day4,多点通信和并发服务器
  • STM32 硬件IIC 控制OLED I2C卡死问题
  • Redis图文指南
  • C++17 std::string_view介绍与使用
  • 写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)
  • Matlab论文插图绘制模板第110期—水平双向柱状图
  • 【广州华锐互动】VR全景工厂虚拟导览,虚拟现实技术提升企业数字化信息管理水平
  • idea 创建mybatis xml文件时找不到
  • Python钢筋混凝土结构计算.pdf-混凝土构件计算
  • mysql5.7-基于docker-compose搭建主从同步
  • 【USRP】调制解调系列5:16QAM、32QAM、64QAM、256QAM、1024QAM、基于labview的实现
  • Odoo|5分钟创建自定义的业务系统唯一序列号
  • mysql索引为什么提高查询速度(底层原理)
  • 算法通关村——位运算在查找重复元素中的妙用
  • 使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)
  • 【python基础知识】5.for循环和while循环
  • STM32CUBEMX_创建时间片轮询架构的软件框架
  • vue 插槽Slots
  • 论文阅读《Nougat:Neural Optical Understanding for Academic Documents》
  • 较难的换根dp:P6213 「SWTR-04」Collecting Coins
  • Springboot - 15.二级分布式缓存集成-Caffeine
  • 二叉树的介绍及二叉树的链式结构的实现(C语言版)
  • 不同写法的性能差异
  • Bytebase 2.7.0 - ​新增分支(Branching)功能
  • day55 动规.p15 子序列
  • TypeScript DOM类型的声明
  • springboot找不到注册的bean
  • MEMS传感器的原理与构造——单片式硅陀螺仪
  • Redis集群服务器
  • 动态维护直径 || 动态维护树上路径 || 涉及LCA点转序列 || 对欧拉环游序用数据结构维护:1192B