基于xdocreport导出复杂word文档,专业避坑指南
如果你要先问我为什么要导出word?那么请你走开,你个杠精!
在完成这个功能时花费了大量的时间查阅资料,发现能满足导出复杂word文档的工具只有xdocreport,如果有其他的工具欢迎分享。废话不多说,上菜!
一、导入包
<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><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>
相关包的具体版本没做详细研究,没那个时间。
二、网络获取的基本的标签的一般用法
1、${....}
用于变量展示,也可以用作对象属性或者map值的展示,用法如下:
对象属性:${object.XXX}
map:${object["XXX"]}
2、list
数组、列表的循环展示,一般写法
[#list list as item]
${item.a}
[/#list]
ps:很多教程说[#list list as item]要加引号,我发现没啥用,反而会让你展示的东西外面套一个引号!
3、if
一般写法
[#if xxx]
[#else][#elseif xxx]
[/#if]
eg:判断非null [#if (item.a)??][/#if]
具体判断语法可以去自行了解。
以上三个标签已经能够满足我目前的业务需求,其他的语法或者内置函数可以去如下宝藏地址了解,非常详细的总结。
Xdocreport和Freemaker生成docx - 简书
三、代码部分
public void export(Long id) {OutputStream out = null;try {//获取Word模板,模板存放路径在项目的resources目录下InputStream ins = this.getClass().getResourceAsStream("/template.docx");//注册xdocreport实例并加载FreeMarker模板引擎IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,TemplateEngineKind.Freemarker);//创建xdocreport上下文对象IContext context = report.createContext();//获取需要导出的数据//对象数据Test1 test= xxx;//列表1List<Test2> cars = xxx;//列表2List<Test3> meals= xxx;context.put("test1", test.getA());context.put("cars",cars);context.put("meals",meals);HttpServletResponse response = ServletUtils.getResponse();response.setCharacterEncoding("UTF-8");response.setContentType("application/msword");response.setHeader("Content-Disposition", "attachment; filename=".concat(String.valueOf(URLEncoder.encode("i_am_name.docx", "UTF-8"))));out = response.getOutputStream();report.process(context, out);out.flush();} catch (IOException | XDocReportException e) {e.printStackTrace();}finally {try {assert out != null;out.close();} catch (IOException e) {e.printStackTrace();}}}
简单文本代码就是这样,比较简单和基础,比较好消化,如果要搞一些导出图片什么的骚操作,请自行百度其他文章。
那么好了,上肉菜!
四、复杂模板编写
题外前提:
在word文档中,ctrl+F9会出现一对花括号,右键点击选择“编辑域”,类别选择“邮件合并”,域名选择“MergeFeild”,然后右侧域属性就可以编辑模板代码了。
以上的一些内容足够支撑一个简单的word文档的导出业务,类似文本中局部文字的替换或者写入,简单规则表格的生成等。但是出现复杂表格的话会发现难以支撑,在我自己踩了N个坑之后做如下用法的总结;
关于表格的导出,可以使用如下的标签来进行操作:
@before-row[#list cars as car]}
${car.a} ${car.b}
@after-row[/#list]
eg:
«@before-row[#list cars as car]»«@after-row[/#list]» | «${car.driverName}» | «${car.driverNumber}» | «${car.carNumber}» |
如果需要获取序号使用如下代码:${car?index+1}
进阶版1:
«@before-row[#list cars as car]»${car?index+1} | «${car.carNumber}» | «${car.driverANumber}» | «${car.driverAName}» |
«${car.driverBNumber}» | «${car.driverBName}»«@after-row[/#list]» |
进阶版2:
需要进行非空判断时
«@before-row[#list cars as car]»${car?index+1} |
«[#if (car.carNumber)??] ${car.carNumber} [/#if]» |
«${car.driverANumber}» | «${car.driverAName}» |
«${car.driverBNumber}» | «${car.driverBName}»«@after-row[/#list]» |
进阶版3:
需要对列表项循环项进行非空判断时
«@before-row [#if (cars)??] [#list cars as car]»${car?index+1} |
«[#if (car.carNumber)??] ${car.carNumber} [/#if]» |
«${car.driverANumber}» | «${car.driverAName}» |
«${car.driverBNumber}» | «${car.driverBName}»«@after-row[/#list][/#if]» |
注意此处[#if][/#if]的添加位置。进阶版3可满足任意的复杂表格的嵌套的模板的书写。
时间有限,饭菜简单,吃完撤盘擦桌子,发现问题请多多指教。
基于xdocreport导出复杂word文档,专业避坑指南相关推荐
- Java项目中利用Freemarker模板引擎导出--生成Word文档
应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...
- 前端报表导出成word文档(含echarts图表)
前端报表导出成word文档(含echarts图表) 一.问题背景: 前端vue做的各种维度的报表,原来是通过前端整体截屏导出成PDF,但部分报表在遇到跨页时会被截断,客户体验极差.然后又考虑客户可能需 ...
- 将HTML导出生成word文档
前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...
- 导出备忘录Word文档
这里写自定义目录标题 /*** 导出备忘录Word文档** @param id* @return*/@Overridepublic String exportWordMemo(Long id) thr ...
- js将html转为word文档,js将html导出到word文档(含echarts图表)
需求 在开发项目途中遇到了一个需求,就是将一个整个HTML界面导出到word文档,其中包含了echarts图表,经过一番折腾,终于完成了~~~(鸡肋),过程中用到了几个插件,总结了一下几个步骤,希望可 ...
- HTML导出生成Word文档
前言 在某某夜黑风高的一天即将下班的时候,老板召集公司大神们,进行了一个紧急会议,此会议主要目的是老板的客户提出了一些小需求, 有一个前端小 需求,需要将前端HTML导出为Word文档,因为没有做过此 ...
- js将HTML导出生成word文档
在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileS ...
- 用js将HTML文本导出生成word文档
在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileS ...
- 前端实现HTML导出为word文档
需求:将页面或者页面上所需要的部分导出为word文档 基本导出 修改样式 修改图片大小 修改导出文档名称 修改导出默认方式 准备工作: jquery FileSaver.js jquery.worde ...
最新文章
- SAE下修改models里面字段
- adc0808温度换算公式_adc0808模数转换电路图及程序
- java邮件附件默认路径_JavaMail - 文件夹管理( Folder Management)
- firewall添加白名单_firewall的规则设置与命令(白名单设置)
- easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
- Gentoo - X11 forwarding request failed on channel 0
- word-wrap: break-word; break-word: break-all;区别
- ci 地址去掉index.php,CI框架如何删除地址栏的 index.php
- php error_get_last(),PHP捕获异常register_shutdown_function和error_get_last的使用
- js 难点之call,apply实现
- 60-420-020-使用-存储过程-使用存储过程和函数插入大数据量
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【一】
- excel方格子插件_转载 | 18个Word/Excel/PPT插件整理
- 机器人学DH参数及利用matlab符号运算推导
- MATLAB直方图图像去雾算法实现
- OpenGL 渐变色背景
- 淘宝之初:湖畔花园小区里诞生的巨人
- 【Pytorch->ONNX->NCNN->NCNNfp16->vs编译】Windows NCNN部署
- 这八个步骤,Python让你轻松爬取B站弹幕,网友看了都说666
- 40岁销售被裁员后抑郁了,学Python是他最后的希望