導出數據到具體的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 版本,剛開始不是用的這一個版本,遇見了稀奇古怪的問題