在做j2ee系统的时候,经常会遇到按照模板生成word文件,那么,我下面将详细的方法记录下来,以便于大家查看
- 首先,我们要想将包导入我们的项目
freemarker.jar
- 对于一个模板我们需要两个很重要的文件(.doc文件与.ftl文件)
.doc文件就是我们模板的一个样例文件
.ftl文件生成方法是这样:将.doc文件里面想要被自动填入的位置写上相对应的字段名称(也就是key)然后将这个.doc文件另存为.xml文件,之后对这个字段进行处理,处理方法是用${}把这个字段名包裹起来比如说${xm!},这里就会把你传过来的key为xm的值放到里面(后面的!是判断是后传过来的为空,如果是空就放空字符串)例子如下
<w:p w:rsidR="00CA42DD" w:rsidRPr="008E29E5" w:rsidRDefault="00500E61" w:rsidP="00DB4832">
<w:pPr>
<w:spacing w:line="360" w:lineRule="auto" />
<w:rPr>
<w:rFonts w:ascii="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:hAnsi="宋体" />
<w:sz w:val="28" />
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00500E61">
<w:rPr>
<w:rFonts w:ascii="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:hAnsi="宋体" />
<w:color w:val="FF0000" />
<w:sz w:val="28" />
</w:rPr>
<w:t>${organization!}</w:t>
</w:r>
<w:r w:rsidR="00CA42DD" w:rsidRPr="008E29E5">
<w:rPr>
<w:rFonts w:ascii="仿宋_GB2312" w:eastAsia="仿宋_GB2312" w:hAnsi="宋体" w:hint="eastAsia" />
<w:sz w:val="28" />
</w:rPr>
<w:t>:</w:t>
</w:r>
</w:p>
<!--列表数据-->
<#list ryList as ry>
${ry.xm!}
</#list>
最后将这个.xml文件的后缀名改成.ftl即可
- 然后我们调用freemarker的方法实现填充模板信息,下面我将我我们的实现方法给大家展示出来,大家根据自己的需求可进行相对应的更改
public void outputFile(ServletContext servletContext ,String templateFileDirectoryPath,String templateFileName,String outputFilePath,HashMap<String, Object> templateDatas){
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
configuration.setServletContextForTemplateLoading(servletContext, templateFileDirectoryPath);
try {
Template template = configuration.getTemplate(templateFileName);
template.setEncoding("UTF-8");
File outFlie = new File(outputFilePath);
try {
FileOutputStream fileOutputStream = new FileOutputStream(outFlie);
OutputStreamWriter outputStream;
try {
outputStream = new OutputStreamWriter(fileOutputStream, "UTF-8");
Writer out = new BufferedWriter(outputStream);
try {
template.process(templateDatas, out);
} catch (TemplateException e) {
e.getMessage();
log.error("模板数据绑定异常!");
}
out.flush();
} catch (UnsupportedEncodingException e) {
log.error("未找到指定编码格式");
}
} catch (FileNotFoundException e) {
e.getMessage();
log.error("未找到输出文件:"+outputFilePath);
}
} catch (IOException e) {
e.getMessage();
log.error("模板文件:"+templateFileDirectoryPath+templateFileName+"读取异常!");
}
}
下面我对这五个参数获取方式进行一下解释:
1.servletContext:request.getSession().getServletContext();
2.templateFileDirectoryPath:存放模板的路径(一般情况下,.doc与.ftl存在同一个路径里面,这样比较方便找到,如:[res/files/foreignaffairs/goabroad/template/freemarker/])
3.templateFileName:模板文件名称(即.ftl的文件名称)
4.outputFilePath:新生成文件的路径
5.templateDatas:数据:通常情况下是Map<String,Object>类型
这样就大功告成了,炒鸡简单,附件中会给大家一个xml格式化软件,用起来就方便极了!! :)