随笔 - 15  文章 - 0  评论 - 1  阅读 - 14983

java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地

最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了

复制代码
ByteArrayOutputStream zipos = new ByteArrayOutputStream(61858764);//设置大小为60M
        ZipOutputStream zos = new ZipOutputStream (zipos) ;//创建压缩流,初始化一个输出流缓存区
        for(Entry<String, JSONObject> entry : mapData.entrySet()){
            String key = entry.getKey();
            JSONObject jsonVal = entry.getValue();
            OrderMonitorExcelViewSvc orderMonitorExcelView = new OrderMonitorExcelViewSvc(jsonVal);
            try {
                orderMonitorExcelView.outputToFile("orderMonitorExport_"+key);
            } catch (Exception e1) {
                logger.info(e1);
            }
            HSSFWorkbook workbook = orderMonitorExcelView.getWorkbook();
            ByteArrayOutputStream os = new ByteArrayOutputStream(61858764);//设置大小为60M
            try {
                workbook.write(os);
                      //创建一个压缩文件里的名称
                ZipEntry zipEntry = new ZipEntry("订单监控查询"+key+".xls");
                System.out.println(os.size());
                zipEntry.setSize(os.size());
                zipEntry.setCompressedSize(os.size());
                  zos.putNextEntry(zipEntry);
                  os.writeTo(zos);
                zos.closeEntry();      
                os.close();
            } catch (IOException e) {
                logger.info("写入ZipOutputStream异常");
            }
        }
        try {
            zos.close();//注意关闭流的顺序,在上传oss之前必须关闭流否则下载解压的时候会报“文件末端错误”的问题
            zipos.close();
            ByteArrayInputStream zipis = new ByteArrayInputStream(zipos.toByteArray());
            @SuppressWarnings("deprecation")
            int rel = cpsdCoralStorage.uploadFile("order_monitor_data/"+batchno,zipis);
            if(rel==0){
                orderMonitorDao.updateDownloadBatch("0", batchno);
            }
            zipis.close();
        } catch (IOException e) {
            logger.info("上传oss失败");
            logger.info("关闭压缩流异常"+e);
        }
复制代码

下载方法:

复制代码
@RequestMapping(value = { "downloadExport" })
    public void downloadExport(HttpServletRequest request, HttpServletResponse response,
        @RequestParam(value = "batchno", required = true) String batchno) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String formatDate = sdf.format(new Date());
        String pathName = "order_monitor_data/" + batchno;
        String srcFileName = "导出结果" + formatDate + ".zip";
        InputStream is = cpsdCoralStorage.downloadFile(pathName);
        try {
            response.setHeader("content-disposition",
                "attachment;filename=" + URLEncoder.encode(srcFileName, "utf-8"));
            OutputStream out = response.getOutputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int temp =0;
            while((temp=is.read())!=-1){ // 读取内容  
                baos.write(temp);
            }
            byte[] xlsBytes = baos.toByteArray();
            out.write(xlsBytes);
            out.flush();
            out.close();
        }
        catch (FileNotFoundException e) {
            logger.logException(e);
        }
        catch (IOException e) {
            logger.logException(e);
        }
    }
复制代码

本次分享主要是因为之前导出都是先存一个文件,需要找一个存储目录,这样发布到生产环境会有各种问题,还需要看文件夹是否有读写权限,我用的这个方法是直接设置一个存储流,直接对流进行操作,省去了这些麻烦!

 

posted on   宇宙小子  阅读(2721)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示