java 导出数据为word文档(保持模板格式)
导出数据到具体的word文档里面,word有一定的格式,需要保持不变
这里使用freemarker来实现:
①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换 如 aaaaaaaaaaaaaaaa
②:将word文档另存为 2003 xml格式
③:找到需要替换的地方, 如 将 aaaaaaaaaaaa 修改为 ${userName}
如果是list展示,注意按照如下方式修改:
<#list list1 as list1Item> XXXXXXXXXXXXXXXXXX 原有格式代码 如一行数据或者一个单元格 </#list>
④:替换完成后,将xml文件后缀修改为ftl
java代码如下:
package com.xiao; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) throws UnsupportedEncodingException { Map<String, Object> dataMap = new HashMap<String, Object>(); dataMap.put("name", "肖昌伟"); dataMap.put("depart", "云平台"); dataMap.put("date", "2016年");
//列表数据封装 List<String> list1 = new ArrayList<String>(); list1.add("itema"); list1.add("itemb"); list1.add("itemc"); dataMap.put("list1", list1); DocumentHandler mdoc = new DocumentHandler(); mdoc.createDoc(dataMap, "E:/outFile2.doc"); } }
package com.xiao; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class DocumentHandler { private Configuration configuration = null; public DocumentHandler() { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); } public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException { //需要导出模板的包路径 configuration.setClassForTemplateLoading(this.getClass(), "/com/xiao"); Template t = null; try { t = configuration.getTemplate("template.ftl"); } catch (IOException e) { e.printStackTrace(); } File outFile = new File(fileName); Writer out = null; FileOutputStream fos = null; try { fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8"); out = new BufferedWriter(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下载文件
public void download(HttpServletRequest request, HttpServletResponse response) throws Exception { try { File f = new File(文件路径); FileInputStream fin = new FileInputStream(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 版本,刚开始不是用的这一个版本,遇见了稀奇古怪的问题