JavaWeb利⽤freemarker根据模板⽣成word并下载
1、⽤到的jar包
⽤到的jar包为freemarker-2.3.18.jar
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.1</version>
</dependency>
2、word模板⽂件处理
⾸先将确定好的word模板⽂件另存为xml格式,⽤notepad++打开,将要替换的部分⽤${**}替换掉,如下图所⽰:
如果有表格需要遍历显⽰的,到对应需要遍历的⾏,在外层⽤<#list ? as row ></#list>进⾏包围,遍历的⾏⽤ ${row.?}来替换,如下图所⽰:
最后将替换好的xml⽂件后缀名改为.ftl.
3、java 代码部分
⾸先处理需要导出的数据,放⼊Map中(需要遍历的⾏数据以List放⼊Map),然后利⽤freemarker⽣成临时word⽂件后下载,具体代码如下:
public void export(Long id,HttpServletResponse response){
Configuration config =new Configuration();
config.setDefaultEncoding("UTF-8");
config.Class(),"");
//获取需要导出的数据
Map<String, Object> dataMap =getDataMap(id);
Template t = null;
try{
//test.ftl为要装载的模板
String fileName ="⽴项申请书-"+ System.currentTimeMillis()+".doc";
String tempPath = ("");
t = Template("lxsq.ftl");
File outFile =new File(tempPath+File.separator+fileName);
if(!ists()){
}
Writer out = null;
FileOutputStream fos=null;
fos =new FileOutputStream(outFile);
OutputStreamWriter oWriter =new OutputStreamWriter(fos,"UTF-8");
/
/这个地⽅对流的编码不可或缺,使⽤main()单独调⽤时,应该可以,但是如果是web请求导出时导出后word⽂档就会打不开,并且包XML⽂件错误。主要是编码格式不正确,⽆法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out =new BufferedWriter(oWriter);
t.process(dataMap, out);
out.close();
fos.close();
download(outFile, response);
}catch(Exception e){
e.printStackTrace();
}
}
/**
*下载⽣成的word⽂件并删除临时⽂件
*/
public void download(File file , HttpServletResponse response){
ServletOutputStream  out = null;
FileInputStream inputStream = null;
try{
String filename = Name();
response.setCharacterEncoding("utf-8");
response.setContentType("application/DOWLOAD");
response.setHeader("Content-Disposition","attachment; filename="+
String.de(filename,"UTF-8")));
out = OutputStream();
inputStream =new FileInputStream(file);
byte[] buffer =new byte[512];
int bytesToRead =-1;
// 通过循环将读⼊的Word⽂件的内容输出到浏览器中
while((bytesToRead = ad(buffer))!=-1){
out.write(buffer,0, bytesToRead);
}
}catch(Exception e){web下载官方下载
e.printStackTrace();
}finally{
try{
if(null!=out) out.close();
if(null!=inputStream) inputStream.close();
file.delete();
}catch(Exception e2){
e2.printStackTrace();
}
}
}
使⽤过程中注意在处理数据时要避免null值,否则导出过程会报错,此⽅法使⽤时处理好的模板需要放
在java代码的同⼀级⽬录,具体Freemarker提供了3种加载模板⽬录的⽅法,它使⽤Configuration类加载模板:
第⼀种:基于类路径,HttpWeb包下的framemaker.ftl⽂件
configuration.Class(),"/HttpWeb");
第⼆种:基于⽂件系统
configuration.setDirectoryForTemplateLoading(new File("/template"))
第三种:基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl⽂件HttpServletRequest request = Request();
configuration.Session().getServletContext(),"/template"); Template("framemaker.ftl");//framemaker.ftl为要装载的模板

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。