写在前面:此文章为本人学习过程,路过大神不喜勿喷

一、思路

基础使用的是XDocReport这个组件,GitHub地址附上:XDocReport
全英文使用说明,英语好或感兴趣的小伙伴可以直接看原文介绍
再说下我的思路,简单来说就是根据标识替换文字
先在Word中编辑好自己想生成的模板,替换内容即可

二、实现

1、添加必须要使用到的类库Maven地址

<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document</artifactId><version>2.0.2</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template</artifactId><version>2.0.2</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version>
</dependency>
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version>
</dependency>

2、为了方便构建和操作,我先封装好自己所需要的工具类

import lombok.Data;// 此类为方便对应模板中的对应值使用
@Data
public class Column {private String a;private String b;private String c;private String d;private String e;private String f;private String g;private String h;private String i;private String j;private String k;private String l;private String m;private String n;private String o;private String p;private String q;private String r;private String s;private String t;private String u;private String v;private String w;private String x;private String y;private String z;public Column() {}// 此处建议手动生成从1个参数的构造器到全参数构造器,方便之后创建对象// 也可根据自己生成模板中的情况生成对应个数的构造方法
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.ObjectUtil;import java.util.HashMap;
import java.util.Map;// 转化字段为填充表格的字段
public class FieldMappingUtil {private static Map<String, Map<String, String>> MAPPING = new HashMap<>();// 此处线优先声明好字段的映射关系static {Map<String, String> userMapping = new HashMap<>();userMapping.put("name","a");userMapping.put("age","b");MAPPING.put("user", userMapping);}/**** @method change* @Description //TODO  转化* @param o o 需要转化的对象* @param mapping mapping 字段映射关系* @return com.hbisdt.ghg2.entity.Column**/public static Column change(Object o, String mapping) {CopyOptions copyOptions = CopyOptions.create();copyOptions.setFieldMapping(MAPPING.get(mapping));return BeanUtil.toBean(o, Column.class, copyOptions);}
}
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;import java.io.*;
import java.util.List;public class MyXDocReport {private final IXDocReport report;private final IContext context;private final FieldsMetadata fm;public MyXDocReport(String path) throws Exception {//        InputStream ins = this.getClass().getResourceAsStream(path);InputStream ins = new FileInputStream(new File(path));//注册xdocreport实例并加载FreeMarker模板引擎this.report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);//创建xdocreport上下文对象this.context = this.report.createContext();//创建字段元数据this.fm = this.report.createFieldsMetadata();}/*** 存入对应值* @param key* @param obj* @throws XDocReportException*/public void put(String key, Object obj) throws XDocReportException {if (obj instanceof String) {this.context.put(key, obj);} else if (obj instanceof List) {this.context.put(key, obj);this.fm.load(key, Column.class, true);} else if (obj instanceof Column) {this.context.put(key, obj);this.fm.load(key, Column.class, false);}}/*** 获取对应值* @param key* @return*/public Object get(String key){return this.context.get(key);}/*** 对外输出流* @param out* @throws Exception*/public void process(OutputStream out) throws Exception {this.report.process(context, out);}}

下面类中使用到了Hutool工具包中的方法,请按需添加

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.ObjectUtil;import java.util.HashMap;
import java.util.Map;// 转化字段为填充表格的字段
public class FieldMappingUtil {private static Map<String, Map<String, String>> MAPPING = new HashMap<>();// 此处优先声明好字段的映射关系static {Map<String, String> userMapping = new HashMap<>();userMapping.put("name","a");userMapping.put("age","b");MAPPING.put("user", userMapping);}/**** @method change* @Description //TODO  转化* @param o o 需要转化的对象* @param mapping mapping 字段映射关系* @return com.hbisdt.ghg2.entity.Column**/public static Column change(Object o, String mapping) {CopyOptions copyOptions = CopyOptions.create();copyOptions.setFieldMapping(MAPPING.get(mapping));return BeanUtil.toBean(o, Column.class, copyOptions);}
}

3、构建操作程序

public class Test {public static void main(String[] args) throws Exception {MyXDocReport myXDocReport = new MyXDocReport("D:/userTemplate.docx");// 1、 对象填充// 假设我们从数据库查询出一条用户信息User user = new User("张三", 28);Column userColumn = FieldMappingUtil.change(user, "user");myXDocReport.put("user", userColumn);// 2、纯文字填充myXDocReport.put("str", "我是张三, 今年28岁!");// 3、多段文字填充List<String> list = new ArrayList<>();list.add("山哪里有天才,我是把别人喝咖啡的虹夫都用在学习上的。-鲁迅");list.add("世上无难事,只要肯攀登。-毛泽东");list.add("天才出于勤奋。-高尔基");list.add("人类要在竞争中生存,便要奋斗。-孙中山");list.add("天才在于积累,聪明在于勤奋。-华罗庚");list.add("业精于,荒于嬉;行成于思,毁于随。-韩愈");myXDocReport.put("listS", list);// 4、 插入图片IImageProvider logo = new FileImageProvider(new File("D:/car.jpg"),true);myXDocReport.put("logo", logo);// 5、插入列表List<Column> listA = new ArrayList<>();listA.add(FieldMappingUtil.change(new User("张三",29),"user"));listA.add(FieldMappingUtil.change(new User("李四",21),"user"));listA.add(FieldMappingUtil.change(new User("王五",19),"user"));listA.add(FieldMappingUtil.change(new User("陈六",30),"user"));myXDocReport.put("listA", listA);File file = new File("D:/output.docx");if (!file.exists()) {file.createNewFile();}FileOutputStream out = new FileOutputStream(file);myXDocReport.process(out);}@Datastatic class User {String name;Integer age;public User(String name, Integer age) {this.name = name;this.age = age;}}
}

4、构建模板(此处需要知道一个名词:域)



根据上面动图操作可以设计模板

图片插入(需要预先插入一张模板图片,点击选中图片->选择顶部工具栏插入->书签->写入书签名->添加)
插入图片时的模板图片:

运行程序,生成结果

OK~
最后的最后:希望文章可以帮到大家,路过大神不喜勿喷,我们共同学习,加油吧!!!!

Java根据自定义模板生成Word相关推荐

  1. java手动/按模板生成word与excel

    目录 一.前言 二.生成word 1.使用Apache poi手动生成一个word (1)导入依赖 (2)手动生成一个包含表格的word 2.使用Apache poi 按模板生成一个简单的word ( ...

  2. java 用ftl模板生成word时插入多张图片

    前提: 1.知道如何创建ftl模板 2.知道ftl的指令及语法 3.知道如何用java将ftl文件生成word并添加数据 4.知道如何将图片转为base64字符串 内容: 1.在ftl模板中引入多个图 ...

  3. java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF

    添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...

  4. 【Java】使用模板生成word文档到服务器,并下载

    前台js只需要一个方法, 1.Action:说明:dataMap是需要展示的数据, String rootPath = SaveFileUtil.FILE_PATH;此处是为了判断盘符的,win系统和 ...

  5. java后台利用模板生成Word文档提供前台下载

    2016.12.06更新,java后台利用Apache poi生成Excel文档提供前台下载,博客链接http://blog.csdn.net/u010251278/article/details/5 ...

  6. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  7. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

  8. JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...

    Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...

  9. Java使用POI通过模板生成Word

    Java使用POI通过模板生成Word 前言 最近工作需要用到,所以记录下来以便查找. 一.概述 POI读写word使用的核心类是XWPFDocument.一个XWPFDocument代表一个docx ...

最新文章

  1. ug编程内公差和外公差是什么_数控加工编程的主要内容有哪些?
  2. volatile 和 mutable 关键字
  3. 分布式中Redis实现Session终结篇
  4. php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?
  5. leetcode 561. 数组拆分 I(排序)
  6. 工作213:不能改变父组件值
  7. Express 的使用
  8. 使用Levmar的L-M算法拟合曲线
  9. 《天天数学》连载02:一月二日
  10. apache http自动跳转https_NGINX使用rewrite实现http 跳转 https
  11. 多年收集的一些稀有软件3
  12. 查询GPU时无进程运行,但是显存却被占用了
  13. 利用sqlmap注入获取网址管理员账号密码
  14. window10 多桌面切换快捷键 win+tab
  15. apt-get: relocation error:/libapt-private.so.0.0 version APTPKG_5.0 not defined in file libapt-pkg
  16. 论文结尾标注的引用的参考文献批量导入Endnote
  17. 【pandas之数据清洗和处理和空值处理】
  18. unity 2d文字跟随主角移动_使用 Unity 粒子系统实现 2D 人物足迹效果
  19. ACRush 楼天成 回忆录
  20. 2013年中南大学研究生复试机试(1000~1004)

热门文章

  1. TPAMI 2021 | 让时间走向二维,基于文本的视频时间定位新方法:MS-2D-TAN,兼顾速度与精度!...
  2. python socket基于TCP/IP协议实现多人聊天室
  3. winxp右键进入dos
  4. C-V2X技术发展、应用及展望
  5. 云原生系列 六【轻松入门容器基础操作】
  6. 手机抓取蓝牙日志btsnoop的方法汇总(Android一直补充中)
  7. Backtrader(十一) - Indicator指标
  8. wifi android透传源代码,【终极版】ESP8266远程控制wifi透传模块带调试app
  9. 微信小程序预览无法播放视频
  10. 修改hosts不必重启 立刻生效