最近项目上要求实现导出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);
}
}

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

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

  1. c#上传文件(二)使用文件流保存文件

    1.html代码: <asp:FileUpload runat="server" ID="UpLoadFile"/> <asp:Button ...

  2. springboot 头像上传 文件流保存 文件流返回浏览器查看 区分操作系统 windows 7 or linux

    //我的会员中心 头像上传接口 /*windows 调试*/ @Value("${appImg.location}") private String winPathPic; /*l ...

  3. java 实现Excel压缩成Zip导出

    1 概述 在web项目中常见的一种场景就是将文件导出为Excel,但是当需要导出多个Excel时,使用者将频繁操作,这样就严重降低了项目的友好交互性以及易用性,那么怎么才能优雅的解决这个问题呢?笔者今 ...

  4. Java实现将文件或者文件夹压缩成zip

            最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类.但找了好多篇博客,总是发现有bug.因此就自己来写了个工具类.         这个工具类的功能为: ( ...

  5. 【转】Java实现将文件或者文件夹压缩成zip

    转自:https://www.cnblogs.com/zeng1994/p/7862288.html package com.guo.utils; import java.io.*; import j ...

  6. java实现将文件压缩成zip格式

    以下是将文件压缩成zip格式的工具类(复制后可以直接使用): zip4j.jar包下载地址:http://www.lingala.net/zip4j/download.php package util ...

  7. asp.net 把图片压缩成zip之后再进行下载

    //这是导出的js方法 function fundaochu() { var data = "keyword=GetImageListdaochu&type=daochu&m ...

  8. java导出excel报错:getOutputStream() has already been called for this response

    对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...

  9. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

随机推荐

  1. C#中的release和debug模式

    以下内容来源:https://www.cnblogs.com/rgjycs/p/9254332.html 在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包 ...

  2. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  3. Java的内存区域划分

    内存分区简介 老生常谈的问题了,虽然网上一搜一大把,也很详细,但是我还是想写一写,通过自己的总结整理,加深一下印象. 我不知道学习Java内存分区有什么实际作用,但它就是像常识一样,一个使用Java语 ...

  4. File 方法

    File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用 ...

  5. Azure Data Factory(五)Blob Storage 密钥管理问题

    一,引言 之前讲解的ADF 集成Azure DevOps 实现CI/CD,在 Releases Pipeline 阶段,我们是将两个 Blob Storage 的链接字符串复制.粘贴到 "O ...

  6. Socket connect 等简要分析

    connect 系统调用 分析 #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int connect ...

  7. 利用matlibplot绘制雷达图

    之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibplot.pyplot模块中没有直接绘制雷达图的函数,不 ...

  8. MYSQL学习(三) --索引详解

    创建高性能索引 (一)索引简介 索引的定义 索引,在数据结构的查找那部分知识中有专门的定义.就是把关键字和它对应的记录关联起来的过程.索引由若干个索引项组成.每个索引项至少包含两部分内容.关键字和关键 ...

  9. 算法:矩阵连乘(Java)动态规划

    Description 给你2个矩阵A.B,我们使用标准的矩阵相乘定义C=AB如下: A数组中栏(column)的数目一定要等于B数组中列(row)的数目才可以做此2数组的相乘.若我们以rows(A) ...

  10. 早期javac编译器优化

    学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分 ...