1.添加POI的依赖
<!-- 通过POI生成word文档 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
2.创建word模版
创建如下template.docx文件
3.新增word导出工具类
package com.word.demo.util;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class CreateWordUtil {
public static void main(String[] args) throws IOException {
// 模板文件路径
String templatePath = "D:/study/template.docx";
// 输出文件路径
String outputPath = "D:/study/output.docx";
// 准备替换的数据
Map<String, String> placeholders = new HashMap<>();
placeholders.put("name", "John Doe");
placeholders.put("date", "September 29, 2024");
placeholders.put("address", "123 Main Street, Anytown");
// 加载Word模板文件
FileInputStream fis = new FileInputStream(templatePath);
XWPFDocument document = new XWPFDocument(fis);
// 替换段落中的占位符
replacePlaceholders(document, placeholders);
// 输出新的Word文件
FileOutputStream fos = new FileOutputStream(outputPath);
document.write(fos);
// 关闭资源
fos.close();
document.close();
fis.close();
}
/**
* 替换文档中所有段落的占位符
*/
public static void replacePlaceholders(XWPFDocument document, Map<String, String> placeholders) {
for (XWPFParagraph paragraph : document.getParagraphs()) {
replaceTextInParagraph(paragraph, placeholders);
}
// 处理表格内的内容(如果文档中有表格)
for (XWPFTable table : document.getTables()) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph paragraph : cell.getParagraphs()) {
replaceTextInParagraph(paragraph, placeholders);
}
}
}
}
}
/**
* 替换段落中的占位符
*/
public static void replaceTextInParagraph(XWPFParagraph paragraph, Map<String, String> placeholders) {
// 获取段落中的文本
String paragraphText = paragraph.getText();
// 遍历占位符并进行替换
for (Map.Entry<String, String> entry : placeholders.entrySet()) {
String placeholder = "{{" + entry.getKey() + "}}";
String replacement = entry.getValue();
if (paragraphText.contains(placeholder)) {
paragraphText = paragraphText.replace(placeholder, replacement);
// 删除现有的runs
for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) {
paragraph.removeRun(i);
}
// 创建新的run,并设置替换后的文本
paragraph.createRun().setText(paragraphText);
}
}
}
}
使用stream和lambda优化过后的代码如下:
package com.word.demo.util;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class CreateWordUtil {
public static void main(String[] args) throws IOException {
// 模板文件路径
String templatePath = "D:/study/template.docx";
// 输出文件路径
String outputPath = "D:/study/output.docx";
// 准备替换的数据
Map<String, String> placeholders = new HashMap<>();
placeholders.put("name", "John Doe");
placeholders.put("date", "September 29, 2024");
placeholders.put("address", "123 Main Street, Anytown");
// 加载Word模板文件
FileInputStream fis = new FileInputStream(templatePath);
XWPFDocument document = new XWPFDocument(fis);
// 替换段落中的占位符
replacePlaceholders(document, placeholders);
// 输出新的Word文件
FileOutputStream fos = new FileOutputStream(outputPath);
document.write(fos);
// 关闭资源
fos.close();
document.close();
fis.close();
}
/**
* 替换文档中所有段落的占位符
*/
public static void replacePlaceholders(XWPFDocument document, Map<String, String> placeholders) {
document.getParagraphs().stream()
.forEach(paragraph -> replaceTextInParagraph(paragraph, placeholders));
// 处理表格内的内容(如果文档中有表格)
document.getTables().stream()
.flatMap(table -> table.getRows().stream())
.flatMap(row -> row.getTableCells().stream())
.flatMap(cell -> cell.getParagraphs().stream())
.forEach(paragraph -> replaceTextInParagraph(paragraph, placeholders));
}
/**
* 替换段落中的占位符
*/
public static void replaceTextInParagraph(XWPFParagraph paragraph, Map<String, String> placeholders) {
// 遍历占位符并进行替换
placeholders.entrySet().stream()
.filter(entry -> paragraph.getText().contains("{{" + entry.getKey() + "}}"))
.forEach(entry -> {
String placeholder = "{{" + entry.getKey() + "}}";
String replacement = entry.getValue();
String paragraphText = paragraph.getText().replace(placeholder, replacement);
// 删除现有的runs
for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) {
paragraph.removeRun(i);
}
// 创建新的run,并设置替换后的文本
paragraph.createRun().setText(paragraphText);
});
}
}
4.验证word文档的导出
导出文件如下: