JAVA用Freemarker生成word使用小结

JAVA用Freemarker生成word使用小结

肖教燎,2016年5月2日

一、制作word模板。

1、 先使用记事本,将所需的文字录好,将所需的变量用英文字母表示(如xinming,xinbie),变量尽量复杂一点,再拷入到word中,最好是word2003。 2、 将word另存为Word 2003 XML格式。

3、 可以将XML文件用可以可美化的软件打开,以便更好搜索。(非必要) 4、 搜索变量,如搜索到xinming,将其改为${xinming},所有变量以此类推。 5、 如果涉及到数据是一个集合,则需遍历数据,通常是表格中的数据,如word模板中为一行,但要调用多行数据写入word。方法如下:搜索,如<#list users as user>;搜索随后的,后面加上;将集合里的变量用替代名替代,如${user},如果该list的变量是一个复杂变量,还可以是这种形式,如${user.username}。 6、 将文件的扩展名改为ftl。

二、生成word步骤及可能出现的问题。 1、下载freemarker,下载网址:

https://sourceforge.net/projects/freemarker/?source=typ_redirect

2、主要有以下几个过程:创建freemarker.template.Configuration、freemarker.template.Template对象,将数据放入一个Map对象,调用Template.process方法,即生成新的word文档。

3、问题1:经常出现有FileNotFoundException问题,模块文件默认是放在类所在目录的(即src的相关目录下,这点很奇怪,一般我们会认为在项目根目录)。经研究官方的API,原来freemarker在加载模板时,建议使用TemplateLoader指定从哪个目录开始加载模板,并且将模板加载在缓存中,以TemplateLoader的两个实现类举例说明:

一是FileTemplateLoader文件模板加载器,可以通过文件的绝对路径加载模板:

Configuration cfg = new Configuration(); TemplateLoadertemplateLoader=null;

templateLoader=new FileTemplateLoader(new File(\项目根路径\String path=\cfg.setTemplateLoader(templateLoader);

Template t=cfg.getTemplate(path,\

二是ClassTemplateLoader类模板加载器,通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模块文件的根目录:

templateLoader=new ClassTemplateLoader(PageTag.class,\cfg.setTemplateLoader(templateLoader);

Template t=cfg.getTemplate(\或者:

cfg.setClassForTemplateLoading(this.getClass(), \Tmplatet = cfg.getTemplate(\

三是对于web项目,并且使用了spring,则可以通过spring来配置你模板文件的根目录:

FreeMarkerConfigurationFactoryBean\

4、问题2:生成的word无法打开文档,因为xml有非法字符的问题。 如果使用new BufferedWriter(new OutputStreamWriter(new

FileOutputStream(outFile))),则生成的文件无法在word下打开,应设置编码格式,如下:

newBufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),\三、生成word实例(已经过测试)。

环境:JavasSE-1.7、eclipse-jee-mars-2-win32-x86_64

1、制作word模板如下: 文件名定为:skmd.doc

另存为:skmd.xml

2、eclipse下建立项目test,导入freemarker.jar(Add External Archives…) 建立两个package:cn.xjl.print2word、cn.xjl.print2word.template。 将skmd.xml移至cn.xjl.print2word.template,将其中的变量进行修改。 bianji、teacher、danyindate分别修改为${bianji}、${teacher}、${danyindate}。 搜索到第二个

搜索随后,在后面加上,并将里面的xuhao、xuehao、xinming分别修改为:${xsheng.xuhao}、${xsheng.xuehao}、${xsheng.xinming}。 将文件名修改为skmd.ftl。 修改情况如下图:

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4