利用Java与Apache POI库实现Word模板内容的动态替换并生成新文档

在Java中读取Word模板文档并替换其中的内容,然后生成新的文档,通常可以使用Apache POI库。Apache POI是一个强大的Java库,用于处理Microsoft Office文档,包括Word、Excel等。

图片[1]_利用Java与Apache POI库实现Word模板内容的动态替换并生成新文档_知途无界

以下是一个示例代码,展示如何使用Apache POI读取Word模板文档(.docx),替换其中的占位符,并生成新的文档。

步骤

添加Apache POI依赖
如果你使用Maven,可以在pom.xml中添加以下依赖:

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version> <!-- 请使用最新版本 -->
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.1.1</version>
        </dependency>
    </dependencies>

    编写Java代码

      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.List;
      import java.util.Map;
      
      public class WordTemplateReplacer {
      
          public static void main(String[] args) {
              String templatePath = "path/to/your/template.docx";
              String outputPath = "path/to/your/output.docx";
      
              Map<String, String> replacements = new HashMap<>();
              replacements.put("${name}", "John Doe");
              replacements.put("${date}", "2023-10-01");
      
              try (FileInputStream fis = new FileInputStream(templatePath);
                   FileOutputStream fos = new FileOutputStream(outputPath)) {
      
                  XWPFDocument document = new XWPFDocument(fis);
      
                  // 遍历所有段落
                  for (XWPFParagraph paragraph : document.getParagraphs()) {
                      List<XWPFRun> runs = paragraph.getRuns();
                      if (runs != null) {
                          for (XWPFRun run : runs) {
                              String text = run.getText(0);
                              if (text != null) {
                                  for (Map.Entry<String, String> entry : replacements.entrySet()) {
                                      String placeholder = entry.getKey();
                                      String replacementText = entry.getValue();
                                      if (text.contains(placeholder)) {
                                          text = text.replace(placeholder, replacementText);
                                          run.setText(text, 0);
                                      }
                                  }
                              }
                          }
                      }
                  }
      
                  // 遍历所有表格
                  for (XWPFTable table : document.getTables()) {
                      for (XWPFTableRow row : table.getRows()) {
                          for (XWPFTableCell cell : row.getTableCells()) {
                              for (XWPFParagraph paragraph : cell.getParagraphs()) {
                                  List<XWPFRun> runs = paragraph.getRuns();
                                  if (runs != null) {
                                      for (XWPFRun run : runs) {
                                          String text = run.getText(0);
                                          if (text != null) {
                                              for (Map.Entry<String, String> entry : replacements.entrySet()) {
                                                  String placeholder = entry.getKey();
                                                  String replacementText = entry.getValue();
                                                  if (text.contains(placeholder)) {
                                                      text = text.replace(placeholder, replacementText);
                                                      run.setText(text, 0);
                                                  }
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                      }
                  }
      
                  // 保存新文档
                  document.write(fos);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }

      解释

      1. 依赖:在pom.xml中添加Apache POI及其依赖项。
      2. 读取模板:使用FileInputStream读取Word模板文档。
      3. 替换内容
        • 遍历所有段落,查找并替换占位符。
        • 遍历所有表格中的单元格,查找并替换占位符。
      4. 保存新文档:使用FileOutputStream保存修改后的文档。

      注意事项

      • 占位符:确保模板中的占位符是唯一的,否则可能导致意外的替换。
      • 样式:替换文本时,原始文本的样式可能会被覆盖。如果需要保留样式,可能需要进行更复杂的处理。
      • 异常处理:在实际应用中,应添加更健壮的异常处理机制。

      通过上述步骤,你可以在Java中读取Word模板文档,替换其中的内容,并生成新的文档。

      © 版权声明
      THE END
      喜欢就点个赞,支持一下吧!
      点赞71 分享
      评论 抢沙发
      头像
      欢迎您留下评论!
      提交
      头像

      昵称

      取消
      昵称表情代码图片

        暂无评论内容