Java操作Word模板产生全新内容Word

news2025/1/20 11:57:00

1. spire.doc的jar引用

        首先我们需要用到国产word处理工具jar包spire.doc,可以通过maven仓库寻找,然后在pom文件中直接引用。

        此处需要注意,我们需要使用的是spire.doc.free(免费版的),切勿使用spire.doc(如果使用了,处理后的word文件第一页的顶部会出现红色的警告水印信息)

        如果不能直接从仓库引用到此jar,可以在仓库直接下载下来后,手动存放与本地仓库中,处理方式详见本人的另一个帖子: 本地Maven仓库导入外部jar

2. 编辑模板内容,编辑后如下(示例,仅供参考):

 2.1 测试替换文字内容

/**
     * 替换文档中的制定文字
     *
     * @param inFilePath 文件存放全路径
     * @param map        要替换的内容(key为要替换的内容,value为要替换成的内容)
     * @return 产生的新文件存放地址
     * @throws FileNotFoundException
     */
    public static String replaceText(String inFilePath, Map<String, String> map) throws FileNotFoundException {
        Document doc = new Document(inFilePath);
//        doc.loadFromFile(inFilePath);
//        InputStream in = new BufferedInputStream(new FileInputStream(inFilePath));
//        doc.loadFromStream(in, FileFormat.Docx);
        map.forEach((k, v) -> {
            doc.replace(k, v, true, false);
        });
        String outFilePath = inFilePath.substring(0, inFilePath.lastIndexOf("."));
        outFilePath += "_副本.docx";
        doc.saveToFile(outFilePath, FileFormat.Docx);
        return outFilePath;
    }

    public static void main(String[] args) throws FileNotFoundException {
        String inFilePath = "C:\\Users\\DaiHaijiao\\Desktop/aaa.docx";
        Map<String, String> map = new HashMap<>(8);
        map.put("${name}", "张三");
        map.put("${car}", "配送员李四(15212345678)");
        map.put("${goodName}", "65寸小米电视机");
        map.put("${orderNo}", "NO.86418534741");
        map.put("${dateTime}", "2022-05-06 16:25:30");
        String outPath = WordUtils.replaceText(inFilePath, map);
        System.out.println(outPath);
    }

执行完后会输出新文件地址路径:

 打开此文件我们可以看到内容已经替换完成了

 2.2 替换图片(此处以替换那个假公章为例)

/**
     * 替换文档中的第一张图片
     *
     * @param inFilePath 文档地址路径
     * @param imgPath    新图片地址
     * @return 产生的新文件存放地址
     * @throws FileNotFoundException
     */
    public static String replaceOneImg(String inFilePath, String imgPath) throws FileNotFoundException {
        Document doc = new Document(inFilePath);
        SectionCollection sections = doc.getSections();
        boolean bool = false;
        for (int i = 0; i < sections.getCount(); i++) {
            if (bool) {
                break;
            }
            Section section = sections.get(i);
            ParagraphCollection paragraphs = section.getParagraphs();
            for (int j = 0; j < paragraphs.getCount(); j++) {
                if (bool) {
                    break;
                }
                DocumentObjectCollection childObjects = paragraphs.get(j).getChildObjects();
                for (int k = 0; k < childObjects.getCount(); k++) {
                    Object obj = childObjects.get(k);
                    if (obj instanceof DocPicture) {
                        DocPicture pic = (DocPicture) obj;
                        pic.loadImage(imgPath);
                        bool = true;
                        break;
                    }
                }
            }
        }
        String outFilePath = inFilePath.substring(0, inFilePath.lastIndexOf("."));
        outFilePath += "_副本.docx";
        doc.saveToFile(outFilePath, FileFormat.Docx);
        return outFilePath;
    }

    public static void main(String[] args) throws FileNotFoundException {
        String inFilePath = "C:\\Users\\DaiHaijiao\\Desktop/aaa.docx";
        String imgPath = "C:\\Users\\DaiHaijiao\\Pictures/gz.png";
        String outPath = WordUtils.replaceOneImg(inFilePath, imgPath);
        System.out.println(outPath);
    }

执行完后打开产生的新文件,如下图:

 可以看到,原先的那个假公章已经被替换了,由于代码中的main方法没有替换相应的标识内容,所有那些并没有被修改。代码中写的是替换第一张图片(具体根据自己业务适当变通一下)

2.3 替换文档中所有指定的相同文字成指定图片,替换前的模板如下图所示:

/**
     * 替换文档中所有指定的相同文字成指定图片
     *
     * @param inFilePath 文档地址路径
     * @param text       要替换的文字
     * @param imgPath    要替换成的图片路径
     * @return 产生的新文件存放地址
     * @throws FileNotFoundException
     */
    public static String replaceText2Img(String inFilePath, String text, String imgPath) throws FileNotFoundException {
        Document doc = new Document(inFilePath);

        TextSelection[] allString = doc.findAllString(text, true, false);
        int index;
        for (TextSelection textSelection : allString) {
            DocPicture pic = new DocPicture(doc);
            pic.loadImage(imgPath);
            TextRange range = textSelection.getAsOneRange();
            index = range.getOwnerParagraph().getChildObjects().indexOf(range);
            range.getOwnerParagraph().getChildObjects().insert(index, pic);
            range.getOwnerParagraph().getChildObjects().remove(range);
        }
        String outFilePath = inFilePath.substring(0, inFilePath.lastIndexOf("."));
        outFilePath += "_副本.docx";
        doc.saveToFile(outFilePath, FileFormat.Docx);
        return outFilePath;
    }

    public static void main(String[] args) throws FileNotFoundException {
        String inFilePath = "C:\\Users\\DaiHaijiao\\Desktop/aaa.docx";
        String imgPath = "C:\\Users\\DaiHaijiao\\Pictures/mf.png";
        String text = "${thisImg}";
        WordUtils.replaceText2Img(inFilePath, text, imgPath);
    }

 替换后如下:

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

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

相关文章

c++ - 第23节 - C++的类型转换

1.C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和…

业务安全情报 | 数十万元的数据报告,竟被50元批量转售

近期监测到某咨询公司针数据报告大量泄漏事件&#xff0c;该机构历年的数据报告以及近期更新的针对VIP会员的付费报告均在电商等渠道可以低价获取。 BSL-2022-a3c28号情报文件显示黑灰产通过作弊方式获取查看、下载权限&#xff0c;绕过限制将报告数据大量下载&#xff0c;并通…

javaEE初阶 — 认识文件

文章目录认识文件1. 树型结构组织和目录2. 文件路径&#xff08;Path&#xff09;2.1 绝对路径2.2 相对路径3. 文件的类型认识文件 文件分为 狭义 和 广义 两种 狭义的文件&#xff1a;指的是硬盘上的 文件 和 目录 广义的文件&#xff1a; 泛指计算机中很多的软硬件资源。操…

2022(一等奖)D926刘家峡库区潜在滑坡InSAR识别与分析

作品介绍 1 应用背景 滑坡是普遍存在于世界各地山区的主要灾害之一&#xff0c;严重威胁着人类的生命财产安全和自然环境。滑坡不但会直接破坏人类生命财产安全和建筑物&#xff0c;而且还会造成堰塞湖等次生灾害&#xff0c;进而对人类的生命财产安全和基础设施等造成二次破坏…

暴力破解 SSH

Kali 的 MSF 终端&#xff0c;对渗透目标主机 的 SSH 服务进行暴力破解。 破解的是否成功取决于字典和目标是否使用弱密码。 一&#xff0c;实验环境 分别是攻击机和靶机&#xff08;也可是其他目标服务器&#xff09; 二、利用 SSH 弱密码进行暴力破解 暴力破解最重要的要…

100 道 Linux 笔试题,能拿 80 分就算大神!

本套笔试题共100题&#xff0c;每题1分&#xff0c;共100分。&#xff08;参考答案在文章末尾&#xff09; 1.cron 后台常驻程序 (daemon) 用于&#xff1a; A. 负责文件在网络中的共享 B. 管理打印子系统 C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2.在大多数Li…

如何使用无标签数据进行预训练?

一、直观解释 简单来说就是“造目标”。也即人为地去构造一些子任务&#xff08;论文里的protext task&#xff09;&#xff0c;或者利用一些最基本的公理性常识&#xff0c;去设计“类似监督”的任务。所不同的是&#xff0c;我们引入的“类似监督”的任务通常是用来完成表征…

day13|559.n叉树的最大深度、222.完全二叉树的节点个数

559.n叉树的最大深度 给定一个 N 叉树&#xff0c;找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示&#xff0c;每组子节点由空值分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;r…

基于opencv的图像:边缘检测 (完整代码+详细教程)

给出“离散拉普拉斯算子”一般形式的数学推导 离散值的导数使用差分代替: 所以: 以(x, y)为中心点,在水平和垂直方向上应用拉普拉斯算子,滤波器(对应a=1的情况)为:

广告归因-让你彻底弄归因架构实现

这里会引用神策数据很多的介绍&#xff0c;然后进行总结 归因方法 自归因 渠道商帮我们做归因&#xff0c;有的是每个用户打开 app 都回传给渠道商&#xff0c;渠道商自己归因有的如华为是从应用商店安装时&#xff0c;应用商店把归因信息写入到 app, 然后首次安装启动时能从本…

【信息学CSP-J近16年历年真题64题】真题练习与解析 第12题之加工零件

加工零件 描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 𝑛 位工人,工人们从 1~𝑛编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。 如果 𝑥 号工人想生产一个被加工到第 𝐿(…

回溯法--旅行售货员问题--排列树

回溯法有点类似于暴力枚举的搜索过程&#xff0c;回溯法的基本思想是按照深度优先搜索的策略&#xff0c;从根节点出发深度搜索解空间树&#xff0c;当搜索到某一节点时&#xff0c;如果该节点可能包含问题的解&#xff0c;则继续向下搜索&#xff1b;反之回溯到其祖先节点&…

【学习笔记】【Pytorch】六、nn.Module的使用

【学习笔记】【Pytorch】六、nn.Module的使用学习地址主要内容一、torch.nn模块概述二、nn.Module类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、torch.nn模块概述 概述&#xff1a;帮助程序员方便执行与神经网络相关的行为。…

微信小程序——WXSS模板样式,rpx,样式导入,全局样式和局部样式,全局配置-window

一.WXSS模板样式1.什么是 wxss WXSS ( WeiXin Style Sheets &#xff09;是一套样式语言&#xff0c;用于美化 WXML 的组件样式&#xff0c;类似于网页开发中的CSS。2. WXSS 和 CSS 的关系WXSS 具有 CSS 大部分特性&#xff0c;同时&#xff0c; WXSS 还对 CSS 进行了扩充以及修…

73. 风格迁移以及代码实现

摄影爱好者也许接触过滤波器。它能改变照片的颜色风格&#xff0c;从而使风景照更加锐利或者令人像更加美白。但一个滤波器通常只能改变照片的某个方面。如果要照片达到理想中的风格&#xff0c;可能需要尝试大量不同的组合。这个过程的复杂程度不亚于模型调参。 本节将介绍如…

数据导入导出(POI以及easyExcel)

一.概念&#xff1a; 1.场景需求 将一些数据库信息导出为Excel表格 将Excel表格数据导入数据库 大量数据的导入导出操作 常⽤的解决⽅案为&#xff1a;Apache POI与阿⾥巴巴easyExcel2.Apache POI介绍 Apache POI 是基于Office Open XML 标准&#xff08;OOXML&#xff09;和M…

96、【树与二叉树】leetcode ——404. 左叶子之和:递归法[先序+后序]+迭代法[先序+层次](C++版本)

题目描述 原题链接&#xff1a;404. 左叶子之和 解题思路 一、递归法 &#xff08;1&#xff09;设置一个布尔变量判定&#xff08;先序遍历&#xff09; 左孩子一定在每个子树的最左侧&#xff0c;因此设置一个局部参数flag&#xff0c;当每次遍历的是左子树时&#xff0c…

记录一次Oracle Linux7上安装RDBMS 11.2.0.4的问题

参考文档&#xff1a; 文档1 OHASD fails to start on SuSE 11 SP2 on IBM: Linux on System z (Doc ID 1476511.1) As part of the root.sh, roothas.pl or rootcrs.pl is called and an entry is placed in /etc/inittab h1:35:respawn:/etc/init.d/init.ohasd run >/de…

cmake入门之二:调用外部共享库和头文件

cmake入门之二&#xff1a;调用外部共享库和头文件1.创建外部共享库1.1 创建相关文件或文件夹1.1.1 ext目录下的CMakeLists.txt1.1.2 ext目录lib文件夹下1.1.2.1 hello.h1.1.2.2 hello.c1.1.2.3 CMakeLists.txt1.2 编译、安装2.创建当前项目2.1 创建相关文件或文件夹2.1.1 proj…

为什么这么努力,还是赚不到钱?你不能不知道赚钱的三个模型

大部分人赚钱&#xff0c;都是通过能力努力运气&#xff0c;这种需要付出自己的大量时间和精力&#xff0c;并且赚到的钱也是有上限的。小部分人赚钱是通过&#xff0c;个人IP的商业模式来赚钱&#xff0c;并且跟我们传统的生意不一样的是&#xff0c;这个亏钱是有下限的&#…