主要用的是org.apache.tools.zip.ZipOutputStream  这个zip流,这里以Execl为例子。

思路首先把zip流写入到http响应输出流中,再把excel的流写入zip流中(这里可以不用生成文件再打包,只需把execl模板读出写好数据输出到zip流中,并为每次的流设置文件名)

例如:在项目webapp下execl文件中 存在1.xls,2.xls,3.xls文件

1.Controller

 @RequestMapping(value = "/exportAll",method = RequestMethod.GET)
public void exportAll() throws IOException{
try {
HttpServletResponse response=this.getResponse();
response.setContentType("application/octet-stream");
String execlName = "报表";
response.addHeader("Content-Disposition", "attachment;filename="+new String(execlName.getBytes(),"iso-8859-1") +".zip");
OutputStream out = response.getOutputStream();
testService.exportAll(out);
} catch (Exception e) {
....
}
}

2.Service

import java.io.OutputStream;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

import java.io.File;
import java.io.FileInputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

 public boolean exportAll(OutputStream out){
ZipOutputStream zipStream = null;
HSSFWorkbook wb = null;
try{
List<Test> datas = testService.getTestData();
zipStream = new ZipOutputStream(out);//这里是把zip流输出到httpresponse流中
for(int i=0;i<3;i++){
wb = POIUtil.getWorkbook(i);//获取0,1,2.xls文件
HSSFSheet sheet = wb.getSheetAt(0);
testService.setSheet(sheet,datas);//...处理文件内容操作
ZipEntry zipEntry = new ZipEntry(new String("文件名XXX".getBytes(),"utf-8")+".xls"); //自己命名,这里假设是1,2,3
zipStream.putNextEntry(zipEntry);
wb.write(zipStream);//这里就是循环每次把execl写入zip包中
zipStream.flush();
     }
}catch (Exception e) {
throw new SysException(ERRORConstants.COMMON_SYSTEM_ERROR, e);
}finally {
try {
if(wb!=null){
wb.close();
}
if(zipStream!=null){
zipStream.close();
}
out.flush();
out.close();
} catch (IOException e) {
throw new SysException(ERRORConstants.COMMON_CLOSE_ERROR, e);
}
}
}

  public static HSSFWorkbook getWorkbook(String bh){
    try {
      String line = File.separator;
      ServletRequestAttributes aRequestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
      HttpServletRequest request =aRequestAttributes==null?null:aRequestAttributes.getRequest();
      String webpath=request.getServletContext().getRealPath("/");
      File file = new File(webpath+line+"excel"+line+bh+".xls");

      POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
      HSSFWorkbook wb = new HSSFWorkbook(poifsFileSystem);
      return wb;
   } catch (Exception e) {
      throw new SysException(ERRORConstants.COMMON_SYSTEM_ERROR,e);
   }
  }


  最后的结果生成一个报表.zip,其中包含3个文件1.xls,2.xls,3.xls

Java 批量文件压缩导出,并下载到本地的更多相关文章

  1. 使用secureCRT和Telnet将文件压缩导出到Ubuntu中,到Ubuntu中加压缩发现:tar解压包的时候出现错误gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

    细节描述: 问题如题所示:查找博客园和CSDN上查找问题,得到问题解决方法大致如下: 1 修改解压缩命令: 由 tar zxvf software_package.tar.gz变为tar xvf so ...

  2. java实现文件压缩

    java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...

  3. java读取网页图片路径并下载到本地

    java读取网页图片路径并下载到本地 最近公司需要爬取一些网页上的数据,自己就简单的写了一个demo,其中有一些数据是图片,需要下载下来到本地并且 将图片的路径保存到数据库,示例代码如下: packa ...

  4. 文件压缩跟解压(本地&Linux服务器)

    远程解压需要的jar包: <dependency> <groupId>commons-net</groupId> <artifactId>commons ...

  5. Java批量文件打包下载

    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...

  6. 用java实现文件的断点续传并发下载

    需求: 支持文件批量下载.现在有很多小图片需要批量下载,不希望在服务器打包下载. 支持大文件断点下载.比如下载10G的文件. PC端全平台支持.Windows,macOS,Linux 全浏览器支持.i ...

  7. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  8. Java实现文件压缩与解压[zip格式,gzip格式]

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...

  9. java实现文件的断点续传的下载

    java的断点续传是基于之前java文件下载基础上的功能拓展 首先设置一个以线程ID为名的下载进度文件, 每一次下载的进度会保存在这个文件中,下一次下载的时候,会根据进度文件里面的内容来判断下载的进度 ...

随机推荐

  1. linux命令ln

    创建软连接 ln -s 源文件   目标文件(指向源文件) ln -s /home/test/ /wang

  2. BZOJ 4165 矩阵 堆

    先把每个长为$mina$,宽为$minb$的矩阵扔到堆里,然后由于矩阵中的数都是正的,所以我们每取出来一个矩形,,就把他向四个方向扩张一行,再把这新的且更大的四个矩形扔到堆里.注意判重,于是我比较懒用 ...

  3. spring容器中的beanName

    1. 一个类实现多个接口 如下图中的JobService.java, 此时这个beanName=jobService,  没有包名,类名字首字母小写 可以使用下面三种方式获得这个bean IProce ...

  4. Sqoop架构

    Sqoop 架构 Sqoop 架构是非常简单的,它主要由三个部分组成:Sqoop client.HDFS/HBase/Hive.Database.下面我们来看一下 Sqoop 的架构图. 用户向 Sq ...

  5. 面试大全之JVM篇

    JVM 内存模型以及分区,需要详细到每个区放什么. JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,class类信息常量池(static常量和static变量)等放在方法区 ...

  6. Oracle子查询和多表查询

    多表查询需要用到表的连接 连接可以分为:(自行百度) 交叉连接(数字逻辑的笛卡尔积,不做解释) 等值连接 例如:select * from t_a, t_b where t_a.xx = t_b.xx ...

  7. svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupte...

    今天在svn提交的时候它卡顿了一下,我以为已经提交完了,就按了一下,结果就再也恢复不了,也继续不了了... 报错 cleanup failed–previous operation has not f ...

  8. 网页游戏中PK系统的实现

    在游戏开发过程中,写过一个简单的PK系统面板,涉及到前端和后端的交互,我将自己制作的流程分享给大家,大概流程是这样:前端发送PK邀请给后端,后端受到请求后将信息返回给前端处理,先来看下整个流程图及思路 ...

  9. VMware虚拟机配置文件(.vmx)损坏修复

    我的虚拟机为VM14    装的ubuntu14.04server版 遇到ubuntu打不开,上网查阅了博客写的解决办法,尝试并解决了,以下分享个人心得: 首先进入虚拟机中系统安装的位置 查看日志文件 ...

  10. Python http

    # import httplib # http_client = None # http_client = httplib.HTTPConnection('localhost', 8080, time ...