JAVA用Freemarker生成word使用小结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。方法如下:搜索
6、将文件的扩展名改为ftl。
二、生成word步骤及可能出现的问题。
1、下载freemarker,下载网址:
https:///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="/WEB-INF/classes/com/xxx/tag/templates/page/xxx.ftl";
cfg.setTemplateLoader(templateLoader);
Template t=cfg.getTemplate(path,"UTF-8");
二是ClassTemplateLoader类模板加载器,通过指定类所在的目录来指定模板所在根路径,即指定类在哪个目录,那么这个目录就是加载模块文件的根目录:templateLoader=new ClassTemplateLoader(PageTag.class,"templates/");
cfg.setTemplateLoader(templateLoader);
Template t=cfg.getTemplate("work.ftl","UTF-8");
或者:
cfg.setClassForTemplateLoading(this.getClass(), "templates/");
Tmplatet = cfg.getTemplate("work.ftl");
三是对于web项目,并且使用了spring,则可以通过spring来配置你模板文件的根目录:
4、问题2:生成的word无法打开文档,因为xml有非法字符的问题。
如果使用new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))),则生成的文件无法在word下打开,应设置编码格式,如下:
newBufferedWriter(new OutputStreamWriter(new
FileOutputStream(outFile),"UTF-8"));
三、生成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。
修改情况如下图: