使用FreeMarker实现在线查看报表并导出到word

项目需求:由于项目中要展现报表列表,点击查看按钮实时看到报表,点击导出可以下载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.csdn.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模板导出。虽然维护度低,但都可以实现功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值