项目需求:由于项目中要展现报表列表,点击查看按钮实时看到报表,点击导出可以下载word。
或者可以理解为把报表显示页面并导出到word。
需求难度:查看报表的前端页面,无法直接导出到word,也就是说查看报表前端和后端的逻辑需要做两套,这个很麻烦不好维护。
解决方案:使用FreeMarker实现在线查看报表(包括复杂表格、图片,echarts3图形)并导出到word。
研究了很久,并各种方式尝试,一路研究历程总结下来,方便日后查看学习总结。分享出来,需要的同僚可以参考。
一、第一种方案
FreeMarker的xml模板导出word,网上有各种介绍,这里不多写了,下面有代码,大概步骤是:
编写word模板--->转成xml-->修改变量 -->修改成ftl文件 --> 编写Controller ,具体可以直接看我代码。
这种方案的优势是:
1、FreeMarker可以支持合并单元格等语法,复杂表格可以实现。
2、因为是编写word转xml,报表的各种样式都可以调也非常简单,可以原样输出。
当然缺点是:
1、xml很庞大复杂,后面修改里面的东西,还得需要重新生成xml,变量名会拆分,各种FreeMaker语法还得重新写,无法做成项目级可维护的代码,这一点很蛋疼。不过你要是非常了解xml里面的节点,可以直接在上面改。
2、因为生成的doc,查看页面html无法用这个实现。
二、第二种方案
FreeMarker的html模板导出html(查看html),导出word,关于用html模板导出doc,网上也有介绍,推荐这一篇:https://blog.****.net/u011099093/article/details/81010298,这里也不再赘述。详见文件report2.html。
实现逻辑:编写html模板,调用接口并填充好数据,最终后台在指定目录生成html静态文件,然后启动一个nginx,配置nginx可以通过路径访问静态文件资源,现在点击报表查看按钮,直接打开到nginx发布的服务地址localhost:8090/doctemp/202003.html 直接访问,已经解决查看的问题;至于导出word,其实和这个一样,导出什么类型取决于模板类型和生成文件的后缀名类型,如果导出word,只是一个参数的问题,后缀名直接改成“.doc”即可,详见:
这样导出word也实现了。
这种方案的优点是:
1、一套代码就实现查看报表和导出报表的功能,方便后期维护。
2、报表的模板是html,我们都可以看得懂,修改起来方便。
当然缺点是:
1、按照html模板,可以直接生成html文件,但是html模板freeMarker无法动态合并单元格,尝试过几次非常麻烦,赋值td的rowspan=“${rowspanNo}”这种方式可以解决,但由于我的表格这是值后台无法知道没类数据跨多少行,如下图:
对于我项目中复杂表格这个方案显得无能为力了,至少目前没找到更好解决方案,如果有哪位大神可以解决,欢迎一起交流。
三、最终方案
综合考虑,还是采用两套逻辑实现,前端采用html写页面,导出word采用FreeMarker的xml模板导出。虽然维护度低,但都可以实现功能。