先看結果吧,這只是測試其中有很多因數影響了性能。
表總數為:7千多萬,測試導出100萬

表字段有17個字段
最終excel大小有60多兆


總耗時:126165毫秒 差不多2分多鍾

其核心簡單來說就是分批寫入,就是分頁一樣。這樣的好處就是不會內存溢出。
(真的不會寫博客。。。)
直接上代碼了
public void download(HttpServletResponse response) throws Exception{ // 一次讀取的數量 int listCount = 200000; // 求數據庫中導出數據的總行數 Integer totalCount = analysisMapper.totalNum(); // 根據行數求數據獲取次數 int pageSize = totalCount % listCount > 0 ? (totalCount / listCount) + 1 : totalCount / listCount; //創建poi導出數據對象 SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); //創建sheet頁 SXSSFSheet sheet = sxssfWorkbook.createSheet(); //設置表頭信息 SXSSFRow headRow = sheet.createRow(0); List<String> indexList = new ArrayList<>(); for (int pg = 0; pg < pageSize; pg++) { List<Map<String, Object>> list = analysisMapper.downloadData(pg * listCount, listCount); if(pg == 0 && list.size() > 0){ Map<String, Object> map = list.get(0); for(Map.Entry<String,Object> entry : map.entrySet()){ indexList.add(entry.getKey()); } for (int j = 0; j < indexList.size(); j++) { headRow.createCell(j).setCellValue(indexList.get(j)); } } // 遍歷上面數據庫查到的數據 for (int i = 0; i < list.size(); i++) { SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); for (int j = 0; j < indexList.size(); j++) { dataRow.createCell(j).setCellValue(list.get(i).get(indexList.get(j)).toString()); } } } createFile(response, sxssfWorkbook); }
private void createFile(HttpServletResponse response,SXSSFWorkbook sxssfWorkbook) throws Exception{ // 下載導出 String filename = UUID.randomUUID().toString(); // 設置頭信息 response.setCharacterEncoding("UTF-8"); response.setContentType("application/vnd.ms-excel"); //設置成xlsx格式 response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename + ".xlsx","UTF-8")); //創建輸出流 ServletOutputStream outputStream = response.getOutputStream(); //寫入數據 sxssfWorkbook.write(outputStream); //關閉流 outputStream.close(); sxssfWorkbook.close(); }
若果有啥問題請指正。
