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

2023-11-19

以下代码,亲测可以跑通
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 sheet
                xssfSheet.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;
    }
}


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用java代码给Excel加水印,代码全,进阶版 的相关文章

  • 即使 Excel 中存在多条记录,CopyFromRecordset 也仅复制并粘贴第一行

    我有一个包含表格数据的 Excel 工作表 strSQL SELECT S FIELD NAME1 S FIELD NAME2 S FIELD NAME3 from SourceData A1 IV6 S Dim cn as ADODB C
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何在Excel中识别给定月份的第一,第二等星期一或一周中的其他日期

    我在网上查了一下 但公式看起来很复杂 有什么巧妙的建议吗 例如 我需要一个公式来确定哪个日期是 2014 年 8 月的第一个星期一 类似于第二个星期一的使用 等等 谢谢 一般来说 你可以找到n 第一个x给定的一天M and Y用这个公式 D
  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • 基于多个动态过滤条件过滤Excel范围

    我想过滤数据集 考虑几个可以根据可能值列表动态更改的过滤条件 我有过滤条件team其具有以下值 Team A Team B ALL 其中 ALL 是代表所有团队的通配符 对于第二个标准release 如果我想在过滤器中包含多个版本 则值之间
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • Excel 在“.xls”中发现不可读的内容。同时导出水晶报表到excel

    我正在将数据从 Crystal 报告导出到 PDF 工作正常 并显示所有记录 但是当我将其导出到 Excel 文件中并成功导出时 以及当我在 Excel 中打开它时给出错误消息 文件错误 数据可能已丢失 当我点击 确定 按钮时 在 Exce
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • csdn中使用KaTeX给公式编号

    说明 csdn用的公式编辑器是Katex 并不是LaTeX 两者语法有些区别 比如LaTeX中的公式编号 begin equation 在KateX中就会解析错误 katex中 给公式编号用 tag 1 的形式 例如 E mc 2 tag
  • 【Threejs效果:挖空几何体】ThreeBSP实现墙体挖洞

    1 效果如下 2 代码如下 基本思路 1 创建两个mesh 一个墙体 一个窗户 2 然后取墙体和窗户的差集 将差集转换成几何体 3 根据几何体新建mesh 并贴纹理 依赖库有三个 import as THREE from three imp
  • CPU系统级验证——概览索引

    1 RISC V CPU核指令集验证分析 1 wujian100 1 SoC核分析 无剑100实际上是一款低功耗SoC 采用的CPU核是E902 core通过AHB总线与Icache相连 2 验证环境分析 通过 readmemh test
  • Nginx的alias的用法及与root的区别(转)

    http nginx org en docs http ngx http core module html alias http nginx org en docs http ngx http core module html root 以
  • Anaconda创建虚拟环境出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.ts解决办法

    使用Anaconda创建一个新的环境 执行 conda create n scrapyEnv python 3 6 结果出现了 CondaHTTPError HTTP 000 CONNECTION FAILED for url https
  • 电脑上有哪些好用的视频剪辑软件

    http www 360doc com content 18 0712 08 55889173 769741943 shtml 可以说 现在视频正日益成为营销和社交媒体的一个组成部分 这就是为什么会有视频编辑越来越火的原因 这已随着视频在当
  • matlab 从点云中移除隐藏点

    目录 一 功能概述 1 算法概述 2 主要函数 二 代码实现 三 结果展示 四 参考链接 一 功能概述 1 算法概述 该函数使用如下步骤从指定的视点确定点云中的可见点 1 将点云与中心位于视点的坐标系相关联 2 使用球形投影进行反演 创建一
  • nginx配置vue(history模式)

    问题的原因 项目本来使用 hash 的路由模式来部署 因为需求关系 现在要改成 history 的模式来部署了 路径上不要有 号 第一步 修改项目的 router index js 的配置 const router new VueRoute
  • modbus总线协议(一)modbus rtu

    一 介绍 Modbus协议由Modicon公司开发出来 现在Modbus是工业领域全球最流行的协议 硬件支持RS 232 RS 422 RS 485和以太网设备 应用在PLC DCS 智能仪表等工控领域 图片来源于网络 二 modbus协议
  • template 的使用

    插件介绍 template 是一个高性能的JavaScript模板引擎 插件特性 1 性能卓越 执行速度快 mustache 与 tmpl 的20多倍 2 支持运行时调试 可精准定位异常模板所在语句 3 对 NodeJS Express 有
  • Java NIO Files类读取文件流方式详解

    Java NIO Files类读取文件流方式详解 Files类原理概述 java nio file Files是Java标准库提供的一个工具类 用于操作文件和目录 它提供了一系列静态方法 可以用于创建 复制 删除 移动 重命名 读取 写入文
  • Kaggle研究16,000+数据科学从业者并公开数据 !(附数据集下载)

    来源 机器之心 本文长度为2540字 建议阅读5分钟 本文整理Kaggle对人工智能领域超过16 000受调查者的调查数据结果 Kaggle 是互联网上最著名的数据科学竞赛平台之一 今年3月8日 这家机构被谷歌收购 6月6日又宣布用户数量超
  • 二进制.bin文件切分、bintopng、write

    import numpy as np import cv2 import os Your file path file dep open r E data 3DHuman Detection withoutlabel 20180715 50
  • 小白入门机器学习深度学习实战教程

    课程介绍 机器学习深度学习 实战训练营开课了 哔哩哔哩 bilibili 机器学习深度学习 实战训练营开课了
  • Leetcode——350. 两个数组的交集 II

    题目 给你两个整数数组 nums1 和 nums2 请你以数组形式返回两数组的交集 返回结果中每个元素出现的次数 应与元素在两个数组中都出现的次数一致 如果出现次数不一致 则考虑取较小值 可以不考虑输出结果的顺序 输入 nums1 1 2
  • 关于gitee的用法

    一 安装git 安装git git version 查看版本 创建仓库 git 全局配置 git config global user name huangkaihk git config global user email 邮箱 git
  • 2.6.1 ADSL技术

    ADSL技术 即 非对称数字用户线技术 利用 数字技术 对 现有的 模拟电话用户线 进行改造 使其能够承载宽带数字业务 标准模拟电话信号的 频带 被限制在 300 3400 Hz 的范围内 无法承载宽带数字业务 但 用户线本身 可通过的 信
  • 超详细!4小时开发一个SpringBoot+vue前后端分离博客项目!!

    小Hub领读 前后端分离的博客项目终于出来啦 真是花了好多心思录制咧 文末直接进入B站看视频哈 这次你找不到不关注我B站的理由了吧 作者 吕一明 项目代码 https github com MarkerHub vueblog 项目视频 ht
  • Unity卡死情况

    今天遇到了Unity点击播放后卡死 用任务管理器强行关闭后重开 打不开项目的情况 解决方案 检查USB接口设备 有些设备可能会影响Unity工程启动 比如VR头盔
  • 使用java代码给Excel加水印,代码全,进阶版

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