当前位置: 首页 > news >正文

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

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

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

准备工作
  1. 环境搭建

    • 在项目中添加Apache POI依赖。在pom.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. 导入必要的包

    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. 创建主类和方法

    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. 遍历每个段落中的所有runList<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文档。

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

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

3. 处理表格

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

// 获取文档中的所有表格
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的方法来添加或删除行和列。

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

使用XWPFPictureData类来插入图片。

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来设置文档的样式。

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来访问和修改的。

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

最后,记得保存文档。

FileOutputStream out = new FileOutputStream("output.docx");
document.write(out);
out.close();
document.close();

总结

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习基础--卷积网络
  • 智能语音交互:人工智能如何改变我们的沟通方式?
  • BIOS基础
  • vue3 那些可以让 Vue3 开发更加丝滑的小东西
  • 如何判断IP地址是否异常?
  • cell phone teardown 手机拆卸
  • React18快速入门
  • 浅谈proc目录
  • 跨境电商TikTok Shop指南:高效选品与营销技巧攻略
  • c#如何实现触发另外一个文本框的回车事件
  • 结构者设计模式
  • 深入掌握大模型精髓:《实战AI大模型》带你全面理解大模型开发!
  • leetcode 392. 判断子序列
  • 基于APISIX实现API网关案例分享
  • 友思特方案 | 搭建红外桥梁:嵌入式视觉接口助力红外热像仪传输
  • 收藏网友的 源程序下载网
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • exif信息对照
  • jQuery(一)
  • PHP变量
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 汉诺塔算法
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 算法-图和图算法
  • 线性表及其算法(java实现)
  • 自定义函数
  • ​520就是要宠粉,你的心头书我买单
  • # 计算机视觉入门
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (LeetCode 49)Anagrams
  • (二)JAVA使用POI操作excel
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十六)Java 数据结构
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计高校学生选课系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)Flink 窗口计算
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一) springboot详细介绍
  • (一)Linux+Windows下安装ffmpeg
  • (轉貼) UML中文FAQ (OO) (UML)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .DFS.
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • @Controller和@RestController的区别?
  • @RequestBody与@ModelAttribute
  • [ JavaScript ] JSON方法
  • [10] CUDA程序性能的提升 与 流
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [acm算法学习] 后缀数组SA
  • [C# WPF] 如何给控件添加边框(Border)?