itextpdf实现word模板生成文件

2023-10-22 18:50

本文主要是介绍itextpdf实现word模板生成文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

使用word模板生成文件,如下图,将左侧的模板生成为右侧的填充word文档。
在这里插入图片描述

操作方式

  1. 引入依赖
		 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><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.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-examples</artifactId><version>4.1.2</version></dependency>
  1. 创建模板,创建一份template2.docx文件,内容如下
    在这里插入图片描述
  2. 编写代码
package com.csair.jasypt.myjaspyt.util;import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;public class DocxUtil {public static void parseDocTemplate(String sourcePath, String targetPath, Map<String, Object> data, Map<String, Object> picData) {try {FileInputStream is = new FileInputStream(sourcePath);XWPFDocument document = new XWPFDocument(is);if (data.size() > 0) {changeText(document, data);changeTableText(document, data);}if (picData.size() > 0) {changePic(document, picData);changeTablePic(document, picData);}FileOutputStream out = new FileOutputStream(targetPath);document.write(out);} catch (FileNotFoundException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}public static void changeText(XWPFDocument document, Map<String, Object> textMap) {// 获取段落集合Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();XWPFParagraph paragraph = null;while (iterator.hasNext()) {paragraph = iterator.next();// 判断此段落是否需要替换if (checkText(paragraph.getText())) {replaceValue(paragraph, textMap);}}}public static boolean checkText(String text) {boolean check = false;if (text.contains("$")) {check = true;}return check;}public static void changePic(XWPFDocument document, Map<String, Object> picData) throws Exception {// 获取段落集合Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();XWPFParagraph paragraph;while (iterator.hasNext()) {paragraph = iterator.next();// 判断此段落是否需要替换String text = paragraph.getText();if (checkText(text)) {replacePicValue(paragraph, picData);}}}public static void changeTableText(XWPFDocument document, Map<String, Object> data) {// 获取文件的表格Iterator<XWPFTable> tableList = document.getTablesIterator();XWPFTable table;List<XWPFTableRow> rows;List<XWPFTableCell> cells;// 循环所有需要进行替换的文本,进行替换while (tableList.hasNext()) {table = tableList.next();if (checkText(table.getText())) {rows = table.getRows();// 遍历表格,并替换模板for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {// 判断单元格是否需要替换if (checkText(cell.getText())) {List<XWPFParagraph> paragraphs = cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {replaceValue(paragraph, data);}}}}}}}public static void changeTablePic(XWPFDocument document, Map<String, Object> picData) throws Exception {// 获取文件的表格Iterator<XWPFTable> tableList = document.getTablesIterator();XWPFTable table;List<XWPFTableRow> rows;List<XWPFTableCell> cells;// 循环所有需要进行替换的文本,进行替换while (tableList.hasNext()) {table = tableList.next();if (checkText(table.getText())) {rows = table.getRows();// 遍历表格,并替换模板for (XWPFTableRow row : rows) {cells = row.getTableCells();for (XWPFTableCell cell : cells) {// 判断单元格是否需要替换if (checkText(cell.getText())) {List<XWPFParagraph> paragraphs = cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {replacePicValue(paragraph, picData);}}}}}}}public static void replaceValue(XWPFParagraph paragraph, Map<String, Object> textMap) {XWPFRun run, nextRun;String runsText;List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {run = runs.get(i);runsText = run.getText(0);if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) {while (!runsText.contains("}")) {nextRun = runs.get(i + 1);runsText = runsText + nextRun.getText(0);//删除该节点下的数据paragraph.removeRun(i + 1);}Iterator<Map.Entry<String, Object>> iterator = textMap.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Object> entry = iterator.next();String key = entry.getKey();Object obj = entry.getValue();if (runsText.contains(key) && null != obj) {runsText = runsText.replace(key, obj + "");}}run.setText(runsText, 0);}}}public static void replacePicValue(XWPFParagraph paragraph, Map<String, Object> picData) throws Exception {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String str = run.toString();Iterator<Map.Entry<String, Object>> it = picData.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, Object> entry = it.next();String key = entry.getKey();Object obj = entry.getValue();int idx = str.indexOf(key);if (idx > -1) {run.setText("", 0);FileInputStream is = new FileInputStream((String) obj);// 图片宽度、高度int width = Units.toEMU(100), height = Units.toEMU(100);// 添加图片信息,段落高度需要在模板中自行调整run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) obj, width, height);}}}}
}
  1. 编写测试用例,并执行测试用例
 @Testvoid testWord() throws Exception {Map<String, Object> data = new HashMap<>();Map<String, Object> picData = new HashMap<>();data.put("${year}", "2023");data.put("${month}", "06");data.put("${date}", "20");data.put("${birthday}", "2000年6月11日");data.put("${name}", "王小鱼");data.put("${sex}", "女");data.put("${address}", "北京市朝阳区光明街道幸福小区301号");data.put("${phoneno}", "1380000000");picData.put("${pic}", "D:\\test\\dog.jpg");DocxUtil.parseDocTemplate("D:\\test\\template2.docx","D:\\test\\template2_out.docx",data,picData);System.out.println("----------------end---------------");}

生成得到被填充出来的文件。
在这里插入图片描述

这篇关于itextpdf实现word模板生成文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/263016

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1