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。方法如下:搜索
二、生成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}。 搜索到第二个
搜索随后,在后面加上#list>,并将里面的xuhao、xuehao、xinming分别修改为:${xsheng.xuhao}、${xsheng.xuehao}、${xsheng.xinming}。 将文件名修改为skmd.ftl。 修改情况如下图: