Java如何使用spire进行word文档的替换详解
作者:小花皮猪 发布时间:2022-10-15 09:59:21
前言
今天遇到一个需求,需要对word模板进行替换制定的变量
在网上找了很多方案,做了很多的demo,下面就把我觉得比较简单的一种分享给大家
本次的主角是:spire.doc
spire.doc是专门实现对word的操作(包括文字,表格,图片)
spire.doc介绍
Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET类库。这款控件的主要功能在于帮助开发人员轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。作为一款独立的 Word .NET 控件,Spire.Doc for .NET 的运行系统(服务器端或客户端)均无需安装 Microsoft Word,但是它却可以将 Microsoft Word 文档的操作功能集成到任何开发人员的 .NET 应用程序中。
Spire.Doc for .NET 能执行多种 Microsoft Word 文档处理任务的 .NET API。支持 Word97-2003,Word2007,Word2010 以及 Word2013。能在 Word 97/2003/2007/2010/2013 和 XML、RTF、TXT、XPS、EPUB、EMF、HTML、ODT 等格式文件之间进行双向转换,还能将 Word 文件高质量地转换为 PDF 和 SVG 文件格式。
具体使用可以参考文档: Spire.Doc for .NET 中文教程
前提准备
准备word模板
准备一个word文件,里面简单写点模板:
引入spire.do依赖
spire.doc比较小众,因此需要在pom.xml中导入spire.doc的仓库,导入之后直接导包,如果不配置仓库直接下载依赖是不行的!
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>3.9.0</version>
</dependency>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
案例演示
前提工作准备好之后,就可以开始编写demo了
单个内容替换
短短的三行代码,就完成了读取,替换,保存的功能:
package com.test;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
/**
* @description: 替换word文档中的变量
* @author: 魏一鹤
* @createDate: 2023-01-08 10:51
**/
public class FileTest3 {
public static void main(String[] args) {
//加载Word文档
Document document = new Document("C:\\Users\\PC\\Desktop\\test.docx");
//使用新文本替换文档中的指定文本
document.replace("${name}", "张三丰", false, true);
//保存文档
document.saveToFile("C:\\Users\\PC\\Desktop\\test2.docx", FileFormat.Docx_2013);
}
}
这时候打开桌面生成的文件查看,${name}的变量以及被替换掉了
但是这只是单独替换一个变量,一般一个模板里面是会有很多的变量的,这事我们需要支持批量替换变量
批量内容替换
想要实现批量内容替换,其实也很简单,还是拿上面举例的模板进行操作:
方式1
笨点的方式:既然我们使用的是document.replace进行替换,那么模板里面有多少个变量,我们就写多少个document.replac即可:
package com.test;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
/**
* @description: 替换word文档中的变量
* @author: 魏一鹤
* @createDate: 2023-01-08 10:51
**/
public class FileTest3 {
public static void main(String[] args) {
//加载Word文档
Document document = new Document("C:\\Users\\PC\\Desktop\\test.docx");
//使用新文本替换文档中的指定文本
document.replace("${name}", "张三丰", false, true);
document.replace("${age}", "18", false, true);
document.replace("${sex}", "男", false, true);
//保存文档
document.saveToFile("C:\\Users\\PC\\Desktop\\test2.docx", FileFormat.Docx_2013);
}
}
虽然笨,但是可行:
方式2
虽然上面的方式可行,但是维护起来比较麻烦,这时候我们可以采取这种方式:
声明一个map,把一组组的key和value进行保存,key就是变量, value就是模板值,然后循环map进行替换,这样不管多少个变量,我们都只需要在map里配置即可
package com.test;
import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import java.util.HashMap;
import java.util.Set;
/**
* @description: 替换word文档中的变量
* @author: 魏一鹤
* @createDate: 2023-01-08 10:51
**/
public class FileTest3 {
public static void main(String[] args) {
//加载Word文档
Document document = new Document("C:\\Users\\PC\\Desktop\\test.docx");
//模板变量map
HashMap<String, Object> paramsMap = new HashMap<>();
// 填充key和vaulue key=模板变量,value=替换后的值
paramsMap.put("${name}","张三丰");
paramsMap.put("${age}","18");
paramsMap.put("${sex}","男");
// 循环key
for(String key:paramsMap.keySet()){
// 根据key得到value
String value = paramsMap.get(key).toString();
//使用新文本替换文档中的指定文本 也就是value替换key
document.replace(key, value, false, true);
}
//保存文档
document.saveToFile("C:\\Users\\PC\\Desktop\\test3.docx", FileFormat.Docx_2013);
}
}
再次运行代码,文档里面的变量以及全部完成了替换。
来源:https://blog.csdn.net/weixin_46713508/article/details/128601214


猜你喜欢
- 一 模式介绍重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己
- //执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次。构造代码块在每
- java.util.concurrent.ScheduledThreadPoolExecutor 是JDK1 .6之后自带的包,功能强大,能
- 在使用spring框架中我们都知道,某个类如果使用了@Service、@Autowire 这种依赖注入的方式引用了其他对象,在另外一个类中,
- 和线程停止相关的三个方法/*中断线程。如果线程被wait(),join(),sleep()等方法阻塞,调用interrupt()会清除线程中
- 归纳一些网上取JAVA路径的方法: 注明:如果从ANT启动程序,this.getClass().getResource("&quo
- 1.通过用FTP进行上传文件,首先要实现建立FTP连接,一般建立FTP连接,需要知道FTP配置有关的信息。一般要在Bean中建立一个Serv
- equalsIgnoreCase() 方法用于将字符串与指定的对象比较,不考虑大小写。实例equals() 会判断大小写区别,equalsI
- 案例:当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Lu
- 1. 增强for概述增强for循环,也叫Foreach循环,用于数组和容器(集合类)的遍历。使用foreach循环遍历数组和集合元素时,无需
- Jmeter 执行Java 请求时,运行结束后报错,Tidying up remote @ Mon Feb 24 19:42:34 CST
- 接着上一篇继续,老铁们1.检查数组的有序性给定一个整型数组, 判断是否该数组是有序的(升序) public static bo
- 本文实例为大家分享了C++ socket实现miniFTP的方法,供大家参考,具体内容如下客户端:服务端:建立连接 &
- 本文实例为大家分享了Unity封装延时调用定时器的具体代码,供大家参考,具体内容如下封装一个延时调用定时器类using System.Col
- 前言上篇博文把表连接查询和三种对应关系的写法记录总结了,本篇要把 mybatis 中的动态sql 的使用以及缓存知识记录下来。动态SQL在解
- Kotlin 封装万能SharedPreferences存取任何类型详解/** * author: smart * time: 2016/1
- 本文实例讲述了Java Lambda表达式与匿名内部类的联系和区别。分享给大家供大家参考,具体如下:一 点睛Lambda表达式与匿名内部类存
- 本文实例为大家分享了Android Scroller的使用方法,供大家参考,具体内容如下1、scrollTo和ScrollByView类定义
- 自动去除图像扫描黑边/// <summary>  
- 好,应大家的要求先给大家说下在JAVA程序中instanceof是什么意思instanceof是Java的一个二元操作符,和==,>,