导出数据到具体的word文档里面,word有一定的格式,需要保持不变
这里使用freemarker来实现:
①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换 如 aaaaaaaaaaaaaaaa
②:将word文档另存为 xml格式
③:找到需要替换的地方, 如 将 aaaaaaaaaaaa 修改为 ${userName}
如果是list展示,注意按照如下方式修改:
XXXXXXXXXXXXXXXXXX 原有格式代码 如一行数据或者一个单元格#list>
④:替换完成后,将xml文件后缀修改为ftl
java代码如下:
packagecom.xiao;importjava.io.UnsupportedEncodingException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;public classMain {public static void main(String[] args) throwsUnsupportedEncodingException {
Map dataMap = new HashMap();
dataMap.put("name", "肖昌伟");
dataMap.put("depart", "云平台");
dataMap.put("date", "");
//列表数据封装
List list1 = new ArrayList();
list1.add("itema");
list1.add("itemb");
list1.add("itemc");
dataMap.put("list1", list1);
DocumentHandler mdoc= newDocumentHandler();
mdoc.createDoc(dataMap,"E:/outFile2.doc");
}
}
packagecom.xiao;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.UnsupportedEncodingException;importjava.io.Writer;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.template.Template;importfreemarker.template.TemplateException;public classDocumentHandler {private Configuration configuration = null;publicDocumentHandler() {
configuration= newConfiguration();
configuration.setDefaultEncoding("utf-8");
}public void createDoc(Map dataMap, String fileName) throwsUnsupportedEncodingException {//需要导出模板的包路径
configuration.setClassForTemplateLoading(this.getClass(), "/com/xiao");
Template t= null;try{
t= configuration.getTemplate("template.ftl");
}catch(IOException e) {
e.printStackTrace();
}
File outFile= newFile(fileName);
Writer out= null;
FileOutputStream fos= null;try{
fos= newFileOutputStream(outFile);
OutputStreamWriter oWriter= new OutputStreamWriter(fos, "UTF-8");
out= newBufferedWriter(oWriter);
}catch(FileNotFoundException e1) {
e1.printStackTrace();
}try{
t.process(dataMap, out);
out.close();
fos.close();
}catch(TemplateException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("文档导出完成");
}
}
这样就可以看到填充好了数据的word文档,格式和模板设置的保持一致。
ps:
如果是web项目,需要点击下载后弹出另存为或者保存提示框,则请按照下面代码修改,通过reponse将生成的文件以流形式保存到用户指定的位置:
通过web下载文件
publicvoid download(HttpServletRequest request, HttpServletResponse response)throwsException {try{
File f= newFile(文件路径);
FileInputStream fin= newFileInputStream(f);
response.reset();//设置为没有缓存
response.setContentType("application/x-download;charset=GBK");
response.setHeader("Content-Disposition", "attachment;filename="+Util.getGBK_ISO(ft.getFilename()));/*attachment是以附件下载的形式,inline是以线上浏览的形式。当点击“保存”的时候都可以下载,当点击“打开”的时候attachment是在本地机里打开,inline是在浏览器里打开。*/OutputStream output=response.getOutputStream();byte[] buf = new byte[1024];int r = 0;while ((r = fin.read(buf, 0, buf.length)) != -1) {
output.write(buf,0, r);
}
response.getOutputStream().flush();
response.getOutputStream().close();}catch(Exception e) {}
}
建议采用freemarker-2.3.13.jar 版本,刚开始不是用的这一个版本,遇见了稀奇古怪的问题