一次下载与导出的博弈
一:针对Excel导出如果导出的数据量较小,一般2w条左右(不定原因是由于js中var 变量的长度有限)
var str = "单元格1,单元格2,单元格3,单元格4,..."; str += '\n'; $.ajax({ url: ".../downLoadToExcel", dataType: 'json', data: params, success: function (data) { for (var i = 0; i <data.length; i++) { for (var item in data[i]) { str += data[i][item] + '\t,'; } str += '\n'; } } }); var uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str); //通过创建a标签实现 var link = document.createElement("a"); link.href = uri; //对下载的文件命名 link.download = "导出Excel.csv"; document.body.appendChild(link); link.click(); document.body.removeChild(link);
二:通过前端请求由Java后端Poi技术导出(流导出,可以是很多格式,比如zip,或者xlsx,xls,csv等)
上代码:适用于大Excel导出
@RequestMapping(value = "downLoadToExcel") public void downLoadToExcel(User user, HttpServletRequest request, HttpServletResponse response) throws IOException { // ZipOutputStream zipOutputStream = new ZipOutputStream(out); ServletOutputStream out = response.getOutputStream(); try { List<Map<String, Object>> list = testService.downLoadToExcel(user); request.setCharacterEncoding("UTF-8"); //Excel的行对应的类型名 String[] header = {"","","",""}; double len = list.size(); int ys = 0; if (len < 60000) { ys = 1; } else { ys = (int) Math.ceil(len / 60000); } Workbook wb = new SXSSFWorkbook(); response.setContentType("application/octet-stream; charset=utf-8"); response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode("表名.xlsx")); for (int i = 0; i < ys; i++) { List<Map<String, Object>> bllist = new ArrayList<>(); double bllen = (i + 1) * 60000; if (bllen > len) { bllen = len; } for (int j = i * 60000; j < bllen; j++) { bllist.add(list.get(j)); } Sheet sheet = wb.createSheet("sheet" + i); Row r = sheet.createRow(0); for (int z = 0; z < header.length; z++) { Cell cell = r.createCell(z); cell.setCellValue(header[z]); } int rownum = 1; for (Map info : bllist) { LinkedHashMap lmap = (LinkedHashMap) info; Row row = sheet.createRow(rownum++); int number = 0; for (Iterator it = lmap.entrySet().iterator(); it.hasNext(); ) { Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next(); Cell cell = row.createCell(number++); cell.setCellValue(entry.getValue().toString()); } } } // ZipEntry z = new ZipEntry("Excel名称" + ".xslx"); // zipOutputStream.putNextEntry(z); // wb.write(zipOutputStream); // zipOutputStream.flush(); wb.write(out); out.flush(); } catch (Exception e) { //logger.info("错误信息"); } finally { //注意关闭顺序,否则可能文件错误 // if (zipOutputStream != null) { // zipOutputStream.close(); // } if (out != null) { out.close(); } } return; }
其中也可以选择使用Zip打包的方式写入流(注释代码便是)对应的前端可以使用 a标签下载,form表单提交,window.location.open等请求方式获取下载流。
var link = document.createElement("a"); link.href ="/downLoadToExcel?cs1=1&cs2=2"; document.body.appendChild(link); link.click(); document.body.removeChild(link);