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

news/2024/7/20 17:57:39 标签: 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>

测试类及主要 功能代码:

java">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;
    }
}


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


http://www.niftyadmin.cn/n/5001984.html

相关文章

F#奇妙游(28):ADT中简单值的F#实现

简单值的ADT 在领域建模中&#xff0c;我们尝尝会遇到一些简单的值&#xff0c;比如人的名字、人的编号、物品的代码。如果过早进行程序设计&#xff0c;这些值很容易就会变成程序设计语言中的基本量&#xff0c;string、int这些&#xff0c;就比如人的标号和物品的编号&#…

手机版翻页电子产品册是如何制作的?

手机版翻页电子产品册是一种通过手机设备进行浏览和翻阅的电子产品手册&#xff0c;闲来看一本手机就能阅览的产品图册吧&#xff01; 这本产品图册是在FLBOOK官网看见的&#xff0c;并且FLBOOK官网还支持在线制作&#xff0c;还有很多模板资源供小白自行创作 1.打开浏览器搜索…

Java ArrayList类详解

基本定义 ArrayList 是 Java 中的一个动态数组数据结构&#xff0c;属于 Java 集合框架的一部分&#xff08;java.util 包中的类&#xff09;。它提供了一个基于数组的可变长度列表&#xff0c;允许你在运行时添加、删除和访问元素&#xff0c;而不需要提前指定数组的大小。 简…

IMAU鸿蒙北向开发-2023年9月4日学习日志

1 HarmonyOS 1.1 南向设备开发与北向应用开发 上北下南&#xff0c;上层应用开发叫北向&#xff0c;底层设备开发叫南向。 北向&#xff1a;指的纯应用软件开发&#xff0c;基于官方提供的系统SDK进行应用开发&#xff0c;HarmonyOS 目前支持使用java、js、 ets、c、c进行开发…

ssh的PasswordAuthentication不生效的问题(by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2023-09-04 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 想禁用ssh的密码登录时&#xff0c;都是设置PasswordAuthentication no…

唯品会API接口解析,实现获得按关键字搜索vip商品

要解析唯品会API接口并实现按关键字搜索VIP商品&#xff0c;你需要进行以下步骤&#xff1a; 了解唯品会API接口文档&#xff1a;访问唯品会开放平台&#xff0c;找到API文档&#xff0c;了解唯品会提供的API接口以及相关的参数、返回值等信息。注册开发者账号&#xff1a;在唯…

lv3 嵌入式开发-2 linux软件包管理

目录 1 软件包管理 1.1流行的软件包管理机制 1.2软件包的类型 1.3软件包的命名 2 在线软件包管理 2.1APT工作原理 2.2更新软件源 2.3APT相关命令 3 离线软件包管理 1 软件包管理 1.1流行的软件包管理机制 Debian Linux首先提出“软件包”的管理机制---Deb软件包 …

WebStorm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 WebStorm是一款由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发Web应用程序。它支持多种前端技术&#xff0c;如HTML、CSS、JavaScript、TypeScript等&#xff0c;并提供了丰富的功能和工具&…