zeromemos
最好的学习方法就是输出所学的知识使用poi实现简单的Word模板填充
参考:https://blog.csdn.net/LiuQjie/article/details/127918528
加入3个依赖包
<!-- Word操作依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
在utils包下创建工具类ReplaceWord(文末会给下载):
package com.zeromemos.utils;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ReplaceWord {
/***
* @Description :替换段落文本
* @param document docx解析对象
* @param textMap 需要替换的信息集合
* @return void
* @Date 2022/11/17 17:22
*/
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);
}
}
}
/***
* @Description :检查文本中是否包含指定的字符(此处为“$”)
* @param text
* @return boolean
* @Date 2022/11/17 17:22
*/
public static boolean checkText(String text) {
boolean check = false;
if (text.contains("$")) {
check = true;
}
return check;
}
/**
* 替换图片
*
* @param document
* @param picData
* @throws Exception
*/
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);
}
}
}
/***
* @Description :替换表格内的文字
* @param document
* @param data
* @return void
* @Date 2022/11/18 11:29
*/
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);
}
}
}
}
}
}
}
/***
* @Description :替换表格内图片
* @param document
* @param picData
* @return void
* @Date 2022/11/18 11:29
*/
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);
}
}
}
}
}
}
}
/***
* @Description :替换内容
* @param paragraph
* @param textMap
* @return void
* @Date 2022/11/18 11:33
*/
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);
}
Object value = changeValue(runsText, textMap);
//判断key在Map中是否存在
if (textMap.containsKey(runsText)) {
run.setText(value.toString(), 0);
} else {
//如果匹配不到,则不修改
run.setText(runsText, 0);
}
}
}
}
/***
* @Description :替换图片内容
* @param paragraph
* @param picData
* @return void
* @Date 2022/11/18 11:33
*/
public static void replacePicValue(XWPFParagraph paragraph, Map<String, Object> picData) throws Exception {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
Object value = changeValue(run.toString(), picData);
if (picData.containsKey(run.toString())) {
//清空内容
run.setText("", 0);
FileInputStream is = new FileInputStream((String) value);
//图片宽度、高度
int width = Units.toEMU(100), height = Units.toEMU(100);
//添加图片信息,段落高度需要在模板中自行调整
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) value, width, height);
}
}
}
/***
* @Description :匹配参数
* @param value
* @param textMap
* @return java.lang.Object
* @Date 2022/11/18 11:33
*/
public static Object changeValue(String value, Map<String, Object> textMap) {
Object valu = "";
for (Map.Entry<String, Object> textSet : textMap.entrySet()) {
// 匹配模板与替换值 格式${key}
String key = textSet.getKey();
if (value.contains(key)) {
valu = textSet.getValue();
}
}
return valu;
}
}
创建一个.docx格式Word模板,填充的位置用${名称}代替
在测试目录下测试
@Test
public void run7(){
//替换文本
Map<String, Object> data = new HashMap<>();
//替换图片
Map<String, Object> picData = new HashMap<>();
data.put("${name}", "张三");
data.put("${sex}", "男");
data.put("${test}", "表格外的文本");
//指定图片地址
picData.put("${pic}", "C:\\Users\\admin\\Desktop\\路飞.jpg");
operateWord(data, picData);
}
//执行替换的方法
public static void operateWord(Map<String, Object> data, Map<String, Object> picData){
try {
//指定Word模板文件
FileInputStream is = new FileInputStream("C:\\Users\\admin\\Desktop\\template.docx");
XWPFDocument document = new XWPFDocument(is);
if (data.size() > 0) {
// 替换掉表格之外的文本(仅限文本)
ReplaceWord.changeText(document, data);
// 替换表格内的文本对象
ReplaceWord.changeTableText(document, data);
}
if (picData.size() > 0) {
// 替换内容图片
ReplaceWord.changePic(document, picData);
// 替换表格内的图片对象
ReplaceWord.changeTablePic(document, picData);
}
//导出替换后的文件
FileOutputStream out = new FileOutputStream("C:\\Users\\admin\\Desktop\\demo" + ".docx");
document.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果
评论区
关于我们
本站主要用于记录个人学习笔记,网站开发中,如需以前站内资料请加QQ群272473835索取。注册账号仅提供回帖功能,可不注册!