1、使用freemarker時須要的jar包:freemarker-2.3.19.jar。java
2、根據需求作出導出模板sql
作出Excle模板緩存
這個沒什麼說的,直接按照需求作出Excle模板,以下:(這裏建議用Excle,別用WPS。後面轉存爲XML文件時容易報錯)app
在Excle裏面,建議加上如上圖的${list.aa},list爲須要遍歷的變量,aa爲遍歷後VO裏面的字段,方便在轉存後的XML裏面找到
less
修改擴展名爲ftl,在ftl裏面加上 遍歷的標籤和變量工具
3、獲取須要導出的數據ui
能夠由前臺傳回sql篩選條件,在後臺拼接後。進行查詢數據。編碼
在得到相應的list數據後,放入map
spa
//將資產list放入map @SuppressWarnings("rawtypes") Map dataMap = new HashMap<String, List<Lessee>>(); dataMap.put("size", String.valueOf(size));//size是後面提到的表格的初始行數 dataMap.put("list", list);//list 傳入模板的list //編寫在Excel裏面對應的變量 //模版名稱 String templateName = "exlessee.ftl"; //導出文件的名稱 String exportWord = application.getRealPath("template") + DateUtil.getDateNow("yyyyMMddHHmmss") + ".xls"; exportWord(templateName, dataMap, exportWord, "xxx.xls");
4、封裝的exportWord方法code
/** * 導出的工具方法 */ public void exportWord(String templatePath, Map<String, Object> dataMap, String buildFile, String newName) { try { Configuration configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); String path = application.getRealPath("template"); configuration.setDirectoryForTemplateLoading(new File(path));//此處是本類Class.getResource()相對於模版文件的相對路徑 Template template = null; File outFile = new File(buildFile); Writer writer = null; template = configuration.getTemplate(templatePath); template.setEncoding("utf-8"); writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile), Charset.forName("utf-8")));//此處爲輸 出文檔編碼 template.process(dataMap, writer); writer.flush(); writer.close(); // return true; //設置response的編碼方式 response.setContentType("application/x-msdownload"); //設置附加文件名 response.setHeader("Content-Disposition", "attachment;filename=" + new String(newName.getBytes("gbk"), "iso-8859-1")); //讀出文件到i/o流 FileInputStream fis = new FileInputStream(outFile); BufferedInputStream buff = new BufferedInputStream(fis); byte[] b = new byte[1024];//至關於咱們的緩存 long k = 0;//該值用於計算當前實際下載了多少字節 //從response對象中獲得輸出流,準備下載 OutputStream myout = response.getOutputStream(); //開始循環下載 while (k < outFile.length()) { int j = buff.read(b, 0, 1024); k += j; //將b中的數據寫到客戶端的內存 myout.write(b, 0, j); } //將寫入到客戶端的內存的數據,刷新到磁盤 myout.flush(); myout.close(); } catch (Exception e) { e.printStackTrace(); // return false; } }