itextpdf实现word模板生成文件

news/2024/11/16 2:18:32/

前言

使用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---------------");}

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


http://www.ppmy.cn/news/617492.html

相关文章

【Jmeter教程】_设置请求的参数

目录 一、Jmeter传参 二、区分参数格式 在做接口测试时&#xff0c;发送请求的参数有两种格式&#xff0c;一种是Parameters&#xff0c;一种是JSON 一、Jmeter传参 Jmeter 传Parameters格式的参数 Jmeter 传JSON格式的参数 二、区分参数格式 在不清楚参数到底是何种格式时…

Linux上网本和XP,上网本Linux系统改装XP系统的经验分享.pdf

昨新购一台上网本 将预装的Linux系统改装了XP系统 过程艰辛 为了使大家少走弯路 现将捣鼓过程 介绍如下 目标物 宏基上网本 型号ASPIRE ONE 721 AMD处理器 SATA格式的硬盘 家用一百多G以上的大容量硬 盘多是这种格式 预装Linux系统 目标 删除Linux系统 安装XP系统 并能有一键恢…

联想x100e linux,联想ThinkPad X100e双核版终于上市

年初的CES大展上&#xff0c;联想发布了两款堪称ThinkPad变革之作的新品X100e和Edge。其中&#xff0c;X100e虽然延续了ThinkPad传统的外观设计风格&#xff0c;但在内部却彻底更换为AMD平台&#xff0c;并大胆的采用了红、白色彩&#xff0c;依然极具颠覆意义。 1月底&#xf…

上网本 android,上网本起死回生?Android成主流系统

中关村在线消息&#xff1a;上网本曾经历了辉煌到没落&#xff0c;大部分一线PC厂商都已经放弃了这块市场。不过最近&#xff0c;中国华南地区的部分厂商却又开始大规模生产小巧廉价的上网本产品&#xff0c;只不过这次大多数上网本配备的不是Windows操作系统而是Android操作系…

上网本能装Linux,无光驱安装:上网本安装Linux教程(1)

无光驱安装&#xff1a;上网本安装Linux教程(1) 51CTO独家报道】上网本以其低廉的价格&#xff0c;轻便的体积获得了很多用户的青睐。上网本的主要功能以上网为主&#xff0c;可以支持网络交友、网上冲浪、听音乐、看照片、观看流媒体、即时聊天、收发电子邮件、基本的网络游戏…

计算机专业surface pro,surface pro4家庭版和专业版的不同

1.Windows 7 Starter即Windows 7 简易版或初级版&#xff0c;它是功能最少的Windows 7 版本&#xff0c;可以加入家庭组&#xff0c;任务栏上有变化&#xff0c;有Jump List菜单&#xff0c;但没有Aero效果&#xff0c;仅限于上网本市场。 2.Windows 7 Home Basic Windows 7家庭…

windows7家庭版,专业版,旗舰版,企业版版本区别

Windows 7包含6个版本&#xff0c;分别为Windows 7 Starter(初级版)、Windows 7 Home Basic(家庭普通版)、Windows 7 Home Premium(家庭高级版)、Windows 7 Professional(专业版)、Windows 7 Enterprise(企业版)以及Windows7 Ultimate(旗舰版)。 Windows 7 Starter(初级版) 这是…

linux 上网本 基于ubuntu 台湾,基于Ubuntu 9.04面向上网本的Linux发行版:Easy Peasy 1.5...

Easy Peasy 1.5已是基于Ubuntu 9.04面向上网本的Linux发行版 2009年 9月 8日&#xff0c;今天早上&#xff0c;Jon Ramvi高兴的宣布Easy Peasy 1.5 &#xff0c;一个基于Ubuntu 9.04的面向上网本的Linux发行版发布了。Easy Peasy 1.5 带来了很多新特性&#xff0c;主要的有支持…