如果你要先问我为什么要导出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文档,专业避坑指南相关推荐

  1. Java项目中利用Freemarker模板引擎导出--生成Word文档

    应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...

  2. 前端报表导出成word文档(含echarts图表)

    前端报表导出成word文档(含echarts图表) 一.问题背景: 前端vue做的各种维度的报表,原来是通过前端整体截屏导出成PDF,但部分报表在遇到跨页时会被截断,客户体验极差.然后又考虑客户可能需 ...

  3. 将HTML导出生成word文档

    前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...

  4. 导出备忘录Word文档

    这里写自定义目录标题 /*** 导出备忘录Word文档** @param id* @return*/@Overridepublic String exportWordMemo(Long id) thr ...

  5. js将html转为word文档,js将html导出到word文档(含echarts图表)

    需求 在开发项目途中遇到了一个需求,就是将一个整个HTML界面导出到word文档,其中包含了echarts图表,经过一番折腾,终于完成了~~~(鸡肋),过程中用到了几个插件,总结了一下几个步骤,希望可 ...

  6. HTML导出生成Word文档

    前言 在某某夜黑风高的一天即将下班的时候,老板召集公司大神们,进行了一个紧急会议,此会议主要目的是老板的客户提出了一些小需求, 有一个前端小 需求,需要将前端HTML导出为Word文档,因为没有做过此 ...

  7. js将HTML导出生成word文档

    在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileS ...

  8. 用js将HTML文本导出生成word文档

    在项目开发中中,遇到将HTML导出生成word文档,刚开始在网上找了很多资料,基本都是jQuery中的插件jquery.wordexport.js,刚开始是不想用这个的,这个要引用另一个插件FileS ...

  9. 前端实现HTML导出为word文档

    需求:将页面或者页面上所需要的部分导出为word文档 基本导出 修改样式 修改图片大小 修改导出文档名称 修改导出默认方式 准备工作: jquery FileSaver.js jquery.worde ...

最新文章

  1. SAE下修改models里面字段
  2. adc0808温度换算公式_adc0808模数转换电路图及程序
  3. java邮件附件默认路径_JavaMail - 文件夹管理( Folder Management)
  4. firewall添加白名单_firewall的规则设置与命令(白名单设置)
  5. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
  6. Gentoo - X11 forwarding request failed on channel 0
  7. word-wrap: break-word; break-word: break-all;区别
  8. ci 地址去掉index.php,CI框架如何删除地址栏的 index.php
  9. php error_get_last(),PHP捕获异常register_shutdown_function和error_get_last的使用
  10. js 难点之call,apply实现
  11. 60-420-020-使用-存储过程-使用存储过程和函数插入大数据量
  12. 打造自己的专业图像工具-Visual C++ 2005图像编程系列【一】
  13. excel方格子插件_转载 | 18个Word/Excel/PPT插件整理
  14. 机器人学DH参数及利用matlab符号运算推导
  15. MATLAB直方图图像去雾算法实现
  16. OpenGL 渐变色背景
  17. 淘宝之初:湖畔花园小区里诞生的巨人
  18. 【Pytorch->ONNX->NCNN->NCNNfp16->vs编译】Windows NCNN部署
  19. 这八个步骤,Python让你轻松爬取B站弹幕,网友看了都说666
  20. 40岁销售被裁员后抑郁了,学Python是他最后的希望

热门文章

  1. PR曲线原理及通过曲线判断分类器优劣
  2. php保留一位小数_PHP保留小数的相关方法
  3. C++菱形继承与虚继承
  4. dsrm批量删除域用户
  5. android网络请求失败原因
  6. Java 并发程序的测试
  7. dataframe数据筛选后求和
  8. 解决echarts的叠堆折线图数据出现坐标和值对不上的问题
  9. 数码管 C语言 共阴共阳编码表
  10. html刷新弹窗,点击弹窗后再刷新html页面