HSSFWorkbook-SXSSFWorkbook导出excel文件获取大小记录

HSSSFWorkbook 和SXSSFWorkbook在导出excel workbook对象在执行write方法写入数据到ServletOutputStream时 是有点区别的

HSSFWorkbook在write方法执行完的时候并没有关闭流 ,所以我们可以对这个流统计大小来获取导出文件的大小,并且最后需要我们手动关闭
而SXSSFWorkbook的write方法把流关闭了,write方法执行完之后out流就空了拿不到大小了
可以看一下SXSSFWorkbook的write方法的源码


深度截图_选择区域_20190821235423.png

可以看到流在源码里关闭了。

所以针对不同的workbook对象我们可以采取不同的方法来获取导出流的大小从而来确定导出文件的大小
1.HSSFWorkbook可以通过拿到流写入到文件里来获取文件的大小来获取导出excel的大小
如下面这个controller例子:

/**
     * 导出文件
     * @param request
     * @param response
     */
    @RequestMapping("/salesQuery/modelSalesAmountFaw/exportExcelMap")
    public void exportExcel(HttpServletRequest request,HttpServletResponse response){

        Map paramsMap = getPageParams(request);
        try {
            Workbook wb = modelSalesAmountFawManager.exportExcel(request, paramsMap);
            String excelName = null;
            String languageType = request.getParameter("languageType");
            System.out.println("languageType==="+languageType);
            if("EN".equals(languageType)){
                excelName = java.net.URLEncoder.encode(moduleNameEn, "UTF-8");
            } else{
                excelName = java.net.URLEncoder.encode(moduleName, "UTF-8");
            }
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            SimpleDateFormat dateFormater = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date=new Date();
            response.setHeader("Content-Disposition", "attachment;filename="+excelName+dateFormater.format(date)+".xls" );  
            ServletOutputStream out = response.getOutputStream();  
            wb.write(out);
            
            //先把EXCEL写到临时目录,用来获取文件大小,最后删除
            File f = new File(request.getSession().getServletContext().getRealPath("/") + "/demoExcel/demo.xls");
            if(!f.exists())
            {
                f.createNewFile();
            }
            BufferedOutputStream s = new BufferedOutputStream(new FileOutputStream(f));
            wb.write(s);
            
            //关闭流
            s.flush();
            s.close();
            out.flush();
            out.close();
            
            //记录导出日志,并删除临时文件
            paramsMap.put("exportSize", AppFrameworkUtil.getNum(f.length()/1024, 0));
            logManager.updateModuleLog(paramsMap);
            f.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.SXSSFWorkbook需要生成两遍workbook对象一遍写出一遍用来获取大小
如下面的controller导出例子

/**
     * 导出查询结果
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/query/seniorQuery/getSelectedResultExcel.do")
    @ResponseBody
    public void exportSelectedResult(HttpServletRequest request,HttpServletResponse response){
        
        Map map = new HashMap();
        
        getParam(request, map);
        
        
        JSONObject dataJson=new JSONObject();
        dataJson=(JSONObject) request.getSession().getAttribute("dataJson");
        if(dataJson==null){
            dataJson=seniorQueryService.getSelectedResult(request,map);
        }
        
        Workbook wb = new SXSSFWorkbook();
        Workbook wb2 = new SXSSFWorkbook();
        String excelName = null;
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            String name ="组合查询结果";
            excelName = java.net.URLEncoder.encode(name, "UTF-8");
            
            wb=seniorQueryService.exportSelectedResult(dataJson,wb);
            
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + excelName + ".xlsx");
            
            wb.write(out);
            
            
            //获取导出文件大小
            wb2=seniorQueryService.exportSelectedResult(dataJson,wb2);
            BufferedInputStream bis = null;
            ByteArrayOutputStream os = new ByteArrayOutputStream(); 
            wb2.write(os); 
            byte[] content = os.toByteArray(); 
             
            bis = new BufferedInputStream(new ByteArrayInputStream(content)); 
            System.out.println(bis.available());
            
              
            //记录导出日志
             
            Map logMap = new HashMap();
            logMap.put("export_is_success", 1);
            logMap.put("moduleName", moduleName);
            logMap.put("export_file_size",bis.available());
            logMap.put("export_file_name", "组合查询结果");
            logRecordManager.logRecordInfo(request, logMap);

            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        
        
        
    }

当然以上两种方法都比较笨 要是有更好的方法 欢迎大家留言指正 共同学习呀~

你可能感兴趣的:(HSSFWorkbook-SXSSFWorkbook导出excel文件获取大小记录)