Java根据自定义模板生成Word
写在前面:此文章为本人学习过程,路过大神不喜勿喷
一、思路
基础使用的是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相关推荐
- java手动/按模板生成word与excel
目录 一.前言 二.生成word 1.使用Apache poi手动生成一个word (1)导入依赖 (2)手动生成一个包含表格的word 2.使用Apache poi 按模板生成一个简单的word ( ...
- java 用ftl模板生成word时插入多张图片
前提: 1.知道如何创建ftl模板 2.知道ftl的指令及语法 3.知道如何用java将ftl文件生成word并添加数据 4.知道如何将图片转为base64字符串 内容: 1.在ftl模板中引入多个图 ...
- java 使用 freemarker模板 生成 word 并用 aspose 转换成PDF
添加依赖: <!-- freemarker生成word文件--><dependency><groupId>org.springframework.boot</ ...
- 【Java】使用模板生成word文档到服务器,并下载
前台js只需要一个方法, 1.Action:说明:dataMap是需要展示的数据, String rootPath = SaveFileUtil.FILE_PATH;此处是为了判断盘符的,win系统和 ...
- java后台利用模板生成Word文档提供前台下载
2016.12.06更新,java后台利用Apache poi生成Excel文档提供前台下载,博客链接http://blog.csdn.net/u010251278/article/details/5 ...
- 使用java Apache poi 根据word模板生成word报表
使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...
- apache poi使用例_使用java Apache poi 根据word模板生成word报表例子
[实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...
- JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...
Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...
- Java使用POI通过模板生成Word
Java使用POI通过模板生成Word 前言 最近工作需要用到,所以记录下来以便查找. 一.概述 POI读写word使用的核心类是XWPFDocument.一个XWPFDocument代表一个docx ...
最新文章
- ug编程内公差和外公差是什么_数控加工编程的主要内容有哪些?
- volatile 和 mutable 关键字
- 分布式中Redis实现Session终结篇
- php多进程 写入文件_PHP多进程中使用file_put_contents安全吗?
- leetcode 561. 数组拆分 I(排序)
- 工作213:不能改变父组件值
- Express 的使用
- 使用Levmar的L-M算法拟合曲线
- 《天天数学》连载02:一月二日
- apache http自动跳转https_NGINX使用rewrite实现http 跳转 https
- 多年收集的一些稀有软件3
- 查询GPU时无进程运行,但是显存却被占用了
- 利用sqlmap注入获取网址管理员账号密码
- window10 多桌面切换快捷键 win+tab
- apt-get: relocation error:/libapt-private.so.0.0 version APTPKG_5.0 not defined in file libapt-pkg
- 论文结尾标注的引用的参考文献批量导入Endnote
- 【pandas之数据清洗和处理和空值处理】
- unity 2d文字跟随主角移动_使用 Unity 粒子系统实现 2D 人物足迹效果
- ACRush 楼天成 回忆录
- 2013年中南大学研究生复试机试(1000~1004)
热门文章
- TPAMI 2021 | 让时间走向二维,基于文本的视频时间定位新方法:MS-2D-TAN,兼顾速度与精度!...
- python socket基于TCP/IP协议实现多人聊天室
- winxp右键进入dos
- C-V2X技术发展、应用及展望
- 云原生系列 六【轻松入门容器基础操作】
- 手机抓取蓝牙日志btsnoop的方法汇总(Android一直补充中)
- Backtrader(十一) - Indicator指标
- wifi android透传源代码,【终极版】ESP8266远程控制wifi透传模块带调试app
- 微信小程序预览无法播放视频
- 修改hosts不必重启 立刻生效