Java使用Apache POI向Word文档中填充数据

Java使用Apache POI向Word文档中填充数据

向一个包含占位符的Word文档中填充数据,并保存为新的文档。

准备工作
  1. 环境搭建

    • 在项目中添加Apache POI依赖。在pom.xml中添加如下依赖:

      xml 复制代码
      <dependencies>
          <dependency>
              <groupId>org.apache.poi</groupId>
              <artifactId>poi-ooxml</artifactId>
              <version>5.2.2</version> <!-- 请检查最新的版本号 -->
          </dependency>
      </dependencies>
  2. 准备Word文档

    • 创建一个.docx文件作为模板。在这个文档中,需要定义一些占位符,例如{``{name}}{``{age}}等。这些占位符将在程序运行时被替换为实际的数据。
编写代码
  1. 导入必要的包

    java 复制代码
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.List;
  2. 创建主类和方法

    java 复制代码
    public class WordFiller {
        public static void main(String[] args) {
            try {
                fillDocumentWithValues();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        private static void fillDocumentWithValues() throws Exception {
            // 1. 加载现有的Word文档
            FileInputStream fis = new FileInputStream(new File("template.docx"));
            XWPFDocument document = new XWPFDocument(fis);
            
            // 2. 遍历文档中的所有段落
            List<XWPFParagraph> paragraphs = document.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                // 3. 遍历每个段落中的所有run
                List<XWPFRun> runs = paragraph.getRuns();
                if (runs != null) {
                    for (XWPFRun run : runs) {
                        // 4. 获取文本并替换占位符
                        String text = run.getText(0);
                        if (text != null) {
                            text = text.replaceAll("\\{\\{name\\}\\}", "John Doe");
                            text = text.replaceAll("\\{\\{age\\}\\}", "30");
                            run.setText(text, 0);
                        }
                    }
                }
            }
            
            // 5. 将修改后的文档保存到新的文件
            FileOutputStream out = new FileOutputStream("filled-document.docx");
            document.write(out);
            
            // 6. 关闭所有打开的资源
            out.close();
            fis.close();
            document.close();
        }
    }
复杂文档的处理
1. 加载文档

首先,加载Word文档。

java 复制代码
FileInputStream fis = new FileInputStream(new File("complex-template.docx"));
XWPFDocument document = new XWPFDocument(fis);
2. 替换文本

对于简单文本的替换,前面的示例已经涵盖了基本方法。对于复杂的文档,可能需要根据不同的情况来决定如何替换文本。

3. 处理表格

如果文档中包含表格,可以使用XWPFTable类来操作表格。

java 复制代码
// 获取文档中的所有表格
List<XWPFTable> tables = document.getTables();

for (XWPFTable table : tables) {
    // 遍历表格中的每一行
    for (int i = 0; i < table.getNumberOfRows(); i++) {
        XWPFTableRow row = table.getRow(i);

        // 遍历行中的每一列
        for (int j = 0; j < row.getTableCells().size(); j++) {
            XWPFTableCell cell = row.getCell(j);
            // 获取单元格中的所有段落
            List<XWPFParagraph> paragraphs = cell.getParagraphs();
            
            for (XWPFParagraph paragraph : paragraphs) {
                // 替换单元格中的文本
                List<XWPFRun> runs = paragraph.getRuns();
                if (runs != null) {
                    for (XWPFRun run : runs) {
                        String text = run.getText(0);
                        if (text != null) {
                            text = text.replaceAll("\\{\\{name\\}\\}", "John Doe");
                            text = text.replaceAll("\\{\\{age\\}\\}", "30");
                            run.setText(text, 0);
                        }
                    }
                }
            }
        }
    }
}
4. 添加/删除表格行或列

可以通过XWPFTable的方法来添加或删除行和列。

java 复制代码
XWPFTable table = tables.get(0); // 获取第一个表格
XWPFTableRow newRow = table.createRow(); // 添加新行
newRow.createCell().setText("New Column"); // 添加新列,并设置文本
5. 插入图片

使用XWPFPictureData类来插入图片。

java 复制代码
File imgFile = new File("path/to/image.png");
FileInputStream fisImg = new FileInputStream(imgFile);
byte[] bytes = new byte[(int) imgFile.length()];
fisImg.read(bytes);

XWPFParagraph para = document.createParagraph();
XWPFRun run = para.createRun();
run.addPicture(bytes, XWPFDocument.PICTURE_TYPE_PNG, "image.png", Units.toEMU(150), Units.toEMU(150));
6. 设置样式

可以通过XWPFStyle来设置文档的样式。

java 复制代码
XWPFStyle style = document.createStyle();
style.setStyleName("MyStyle");
style.setType(XWPFStyle.STYLE_TYPE.CHARACTER);
style.setFontFamily("Arial");

// 应用样式
XWPFParagraph para = document.createParagraph();
para.getStyle().setStyleName("MyStyle");
7. 处理页眉和页脚

页眉和页脚也是可以通过XWPFHeaderXWPFFooter来访问和修改的。

java 复制代码
XWPFHeader header = document.getDocument().getBody().getHeaders().get(0);
XWPFParagraph headerPara = header.createParagraph();
headerPara.createRun().setText("This is the header");
8. 保存文档

最后,记得保存文档。

java 复制代码
FileOutputStream out = new FileOutputStream("output.docx");
document.write(out);
out.close();
document.close();

总结

处理复杂文档时,需要根据文档的具体内容来确定需要处理哪些元素。Apache POI提供了丰富的API来操作Word文档的各种组成部分。通过组合使用这些API,可以实现对文档的全面控制,从而满足各种复杂的需求。务必注意,处理大型文档时,内存管理变得非常重要,因为加载整个文档到内存可能会消耗大量的资源。在处理完毕后,及时关闭流和文档对象是很重要的。

相关推荐
专注API从业者10 分钟前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
摇滚侠28 分钟前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY1 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克31 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
摇滚侠2 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle
梁萌2 小时前
idea报错找不到XX包的解决方法
java·intellij-idea·启动报错·缺少包
Agent产品评测局2 小时前
生产排期与MES/ERP系统打通,实操方法详解 —— 2026企业级智能体自动化选型与实战指南
java·运维·人工智能·ai·chatgpt·自动化
阿丰资源3 小时前
基于Spring Boot的电影城管理系统(直接运行)
java·spring boot·后端
呱牛do it3 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 8)
java
消失的旧时光-19434 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解