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

根据Word模板,使用POI生成文档

突然想起来有个小作业:需要根据提供的Word模板填充数据。这里使用POI写了一个小demo验证下。

测试用模板:
在这里插入图片描述

执行结果
在这里插入图片描述

1.引入依赖坐标

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>

2.获取相关数据的方法

    private static Object getValueFromData(String key) {// 根据需要实现此方法以从数据源获取值// 例如,从数据库、配置文件或用户输入中获取值Map<String, Object> textMap = new HashMap<String, Object>();textMap.put("title","《模板》");textMap.put("myName","--尉某人--");textMap.put("today","2023-11-02");List<Map> tables = new ArrayList<Map>();Map<String, String> tableMap = new HashMap<String, String>();tableMap.put("name","尉某人");tableMap.put("age","26");tableMap.put("phone","189*******");tables.add(tableMap);tableMap = new HashMap<String, String>();tableMap.put("name","王某人");tableMap.put("age","28");tableMap.put("phone","186*******");tables.add(tableMap);tableMap = new HashMap<String, String>();tableMap.put("name","张某人");tableMap.put("age","24");tableMap.put("phone","130*******");tables.add(tableMap);textMap.put("tables",tables);return textMap.get(key);}

3.解析模板并填充数据

    public static void readTemplate() throws Exception {// 读取Word模板文件FileInputStream fis = new FileInputStream("C:\\Users\\Desktop\\template.docx");XWPFDocument document = new XWPFDocument(fis);// 获取所有段落List<XWPFParagraph> paragraphs = document.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if (text != null && text.startsWith("${")) {String key = text.substring(2, text.length() - 1);String value = getValueFromData(key).toString(); run.setText(value, 0);}}}// 获取表格List<XWPFTable> rowTables = document.getTables();for (XWPFTable table : rowTables) {// 遍历表格的每一行for (XWPFTableRow row : table.getRows()) {row.getCell(0).setText("尉某人");row.getCell(1).setText("26");row.getCell(2).setText("おひさしぶりだな");}}// 创建表格并填充数据List<Map> tables = (List<Map>) getValueFromData("tables");int size = tables.size();XWPFTable table = document.createTable(size+1, 3);table.getRow(0).getCell(0).setText("姓名");table.getRow(0).getCell(1).setText("年龄");table.getRow(0).getCell(2).setText("联系方式");for (int i = 0; i < tables.size(); i++) {Map<String,String> map = tables.get(i);XWPFTableRow row = table.getRow(i + 1);row.getCell(0).setText(map.get("name"));row.getCell(1).setText(map.get("age"));row.getCell(2).setText(map.get("phone"));}// 保存文件FileOutputStream fos = new FileOutputStream("C:\\Users\\Desktop\\output.docx");document.write(fos);fos.close();document.close();fis.close();}

4.测试结果

    public static void main(String[] args){try {readTemplate();System.out.println("执行成功!!!");} catch (Exception e) {e.printStackTrace();}}

相关文章:

  • Datawhale-AIGC实践
  • 【服务器】Java连接redis及使用Java操作redis、使用场景
  • pytorch笔记 GRUCELL
  • mediasoup-cluster横向扩容机制
  • mac flutter pb解析报错:protoc-gen-dart: program not found or is not executable
  • 蓝桥杯官网练习题(正则问题)
  • openGauss学习笔记-114 openGauss 数据库管理-设置安全策略-设置帐号有效期
  • gcc: __linux__
  • [SSD综述 1.4] SSD固态硬盘的架构和功能导论
  • Julia文件读写函数:write和read
  • 无mac电脑获取app的公钥的方法
  • IOC容器中的Bean是线程安全的吗?
  • 【jvm】虚拟机栈
  • 好物周刊#29:项目管理软件
  • vector类模拟实现(c++)(学习笔记)
  • Android开源项目规范总结
  • ES6系列(二)变量的解构赋值
  • ES学习笔记(12)--Symbol
  • github指令
  • javascript从右向左截取指定位数字符的3种方法
  • nodejs实现webservice问题总结
  • Python_网络编程
  • Spring Boot MyBatis配置多种数据库
  • 源码安装memcached和php memcache扩展
  • Linux权限管理(week1_day5)--技术流ken
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 分布式技术比较
  • .Net的C#语言取月份数值对应的MonthName值
  • .net中调用windows performance记录性能信息
  • @RestController注解的使用
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [math]判断线段是否相交及夹角
  • [MZ test.16]P1 评测
  • [NISACTF 2022]sign-ezc++
  • [nlp] id2str的vocab.json转换为str2id
  • [office] excel中weekday函数的使用方法 #学习方法#微信#媒体
  • [OS-Linux] CentOS 7.x 使用密钥登录安全设置
  • [PHP]pearProject协作系统 v2.8.14 前后端
  • [Rust学习:二]变量和传参
  • [SOA介绍]什么是SOA?
  • [Windows 编程] Windows 7 开发教程,Windows 7 SDK 下载
  • [Windows编程] 监视DLL装载/卸载
  • [WORK]工作需要,研究一个解析Excel文件
  • [北航软工]技术规格说明书
  • [当人工智能遇上安全] 11.威胁情报实体识别 (2)基于BiGRU-CRF的中文实体识别万字详解