Java POI导出Excel并使用输出流下载文件弹出打开保存框

/**
     * 导出Excel
     * @author Saffi
     */
    @RequestMapping("exportExcel.action")
    public void exportExcel(HttpServletResponse response) throws IOException {
        try {
        // 查询并赋给List集合
        List<Entity> oddList = entityService.listExport();

        // 在内存中创建一个Excel文件,通过输出流写到客户端提供下载
        // 内存中保留 10000 条数据,以免内存溢出,其余写入 硬盘
        SXSSFWorkbook workbook = new SXSSFWorkbook(10000);
        // 创建一个sheet页
        SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet("这是sheet名");
        // 分别设置Excel列的宽度
        sheet.setColumnWidth(0, 100 * 40);
        sheet.setColumnWidth(1, 100 * 50);
        sheet.setColumnWidth(2, 100 * 50);
  
        // 创建标题
        SXSSFRow headRow = (SXSSFRow) sheet.createRow(0);

        headRow.createCell(0).setCellValue("编号");
        headRow.createCell(1).setCellValue("时间");
        headRow.createCell(2).setCellValue("单号");
     

        // 遍历oddList集合
        for (OddNunber odd : oddList) {
            // 创建行
            SXSSFRow dataRow = (SXSSFRow) sheet.createRow(sheet.getLastRowNum() + 1);

            // 创建下标为0的Cell,并将其值设为查询结果中的编号
            dataRow.createCell(0).setCellValue(odd.getOnid());
            // 创建下标为1的Cell,并将其值设为查询结果中的日期
            dataRow.createCell(1).setCellValue(odd.getOrecorddate());
            // 创建下标为2的Cell,并将其值设为查询结果中的单号
            dataRow.createCell(2).setCellValue(odd.getCustomernumber());
        }
        
            // 设置生成的Excel的文件名,并以中文进行编码
            String codedFileName = new String("Excel名".getBytes("gbk"), "iso-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + ".xlsx");
            // 响应类型,编码
            response.setContentType("application/octet-stream;charset=UTF-8");
            // 形成输出流
            OutputStream osOut = response.getOutputStream();
            // 将指定的字节写入此输出流
            workbook.write(osOut);
            // 刷新此输出流并强制将所有缓冲的输出字节被写出
            osOut.flush();
            // 关闭流
            osOut.close();
            /*
             * dispose of temporary files backing this workbook on disk 处理在磁盘上备份此工作簿的临时文件
             * SXSSF分配临时文件,您必须始终清除显式,通过调用dispose方法
             */
            workbook.dispose();
        } catch (Exception e) {
            e.printStackTrace();
            response.sendRedirect("error.action");
            log.error("系统错误", e.fillInStackTrace());
        }
    }

原文地址:https://www.cnblogs.com/shoose/p/7744443.html