好像并没有人给出切实可行的解决方案,那么我来添加一个回答吧!

前年的项目需要一个“在线预览”功能,也就是用户上传的Word或Excel等文档,可以不经过下载直接在线预览。当时对比了多种解决方案,包括Flash等,最终敲定的方案是所有文档统一转化为PDF,然后使用H5技术的PDF在线预览模块来实现在线预览。这样的话,就存在两个关键问题:

1、如何将用户上传的文档转化为PDF?

2、如何在线预览PDF?

第一个问题,因为项目要部署到Linux上,所以基于MS Office的一切解决方案就统统不考虑了。经过一番Google,最终敲定使用LibreOffice的SDK来完成转换。Java同LibreOffice的交互,则使用了开源的JODConverter。经测试,转换基本上可以说完美,速度也很理想。不过遗憾的是,该插件不支持多线程。

第二个问题,使用了火狐他家的PDF.js,纯H5实现,不需要任何插件——包括Flash。基于Flash的方案不仅要对PDF实行2转,而且资料极少且收费。PDF.js完全符合我们的需求。但缺点是,不支持IE8以下的浏览器。

题主的需求,参照我的解决方案,至少PDF的保存,可以得到解决。

现在再绕回去,看看怎么解决数据填写后生成固定格式的文档。

FreeMarker是MVC中,V层,也就是视图层的一环。而事实上,“生成固定格式的文档”,也是位于V层的。也就是说,FreeMarker和文档生成都是视图层,它们可以共用Model层,但彼此之间并没有交集。所以该课题和FreeMarker没有毛线关系。

Java中操作Office系的文档,首推Apache POI库。不过……该库应对读取还好说,写入功能并不强大。特别是针对样式的一些操作,极度的不直观……应付你所谓的“固定格式表格”,我认为是够用的了。

So,在满足题主问题需求的前提下,我给出的解决方案就是:POI(生成文档)-> LibreOffice + JODConverter(转换文档至PDF)。如果有在线预览文档的需求,则使用PDF.js。