一次下载与导出的博弈


一:针对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);    

  

 

 

 

 

posted @ 2018-10-30 16:56  CallmeGodY  阅读(243)  评论(0编辑  收藏  举报