在企业级Java开发中,经常需要根据模板动态生成Word文档(如合同、报告、通知等)。Apache POI 是一个强大的开源库,支持读写 Microsoft Office 格式文件,包括 Word(.doc 和 .docx)。
Apache POI 是 Apache 软件基金会提供的 Java API,用于处理 Microsoft Office 文档。其中:
XWPF 用于处理 .docx(Office Open XML)格式HWPF 用于处理旧版 .doc 格式(已不推荐使用)${name}、${date}import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.Map;
import java.util.HashMap;
public class WordTemplateGenerator {
public static void main(String[] args) throws Exception {
// 1. 加载模板
InputStream is = new FileInputStream("template.docx");
XWPFDocument doc = new XWPFDocument(is);
// 2. 准备数据
Map<String, String> data = new HashMap<>();
data.put("${name}", "张三");
data.put("${date}", "2025-11-13");
// 3. 替换段落中的文本
for (XWPFParagraph paragraph : doc.getParagraphs()) {
replaceInParagraph(paragraph, data);
}
// 4. 替换表格中的文本(如有)
for (XWPFTable table : doc.getTables()) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getCells()) {
for (XWPFParagraph paragraph : cell.getParagraphs()) {
replaceInParagraph(paragraph, data);
}
}
}
}
// 5. 输出新文件
FileOutputStream out = new FileOutputStream("output.docx");
doc.write(out);
out.close();
doc.close();
is.close();
}
private static void replaceInParagraph(XWPFParagraph paragraph, Map<String, String> data) {
for (XWPFRun run : paragraph.getRuns()) {
String text = run.getText(0);
if (text != null) {
for (Map.Entry<String, String> entry : data.entrySet()) {
text = text.replace(entry.getKey(), entry.getValue());
}
run.setText(text, 0);
}
}
}
}
org.apache.poi:poi-ooxml除了编程生成,您也可以使用以下在线工具辅助处理 Word 文档: