Java 批量文件压缩导出,并下载到本地

  主要用的是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

原文地址:https://www.cnblogs.com/zwdx/p/8118379.html

时间: 2024-08-02 21:19:27

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

Java批量文件打包下载

经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用ant.jar中的org.apache.tools.zip里的ZipOutPutStream为实现编码的设置. 代码如下: ant包引用 [html] view plain copy print? <span style="font-size:14px">Xml代码 &

java实现文件压缩与解压

用java实现文件的压缩与解压是很常见的功能. 我最爱上代码: 1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 import net.lingala.zip4j.core.ZipFile; 6 import net.lingala.zip4j.model.ZipParameters; 7 import net.lingala.zip4j.util.Zip4jConstants; 8

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

Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还收录了一些能读写压缩格式流的类.要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了.这些类不是Reader和Writer,而是Inpu

JAVA中文件压缩、解压好方法分享

最近项目中有一个功能需要将文件压缩和解压,我这边最开始使用的是JDK中的类库,在网上找了一些样例,或多或少总是存在一些BUG,而且中文路径乱码的问题始终不能解决.没办法最终只有换方案,最后使用了apache-ant中的工具类来实现的,并且测试通过.源码也是从网上找到的,做了少量修改,这里给大家分享一下. package com.aeai.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im

java的文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

java实现文件上传和下载

写在前面 [文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后者主要通过编程语言开发的app作为客户端来访问服务端,一般采用七层协议中的[传输层tcp]进行数据传输. 文章主要完成简单java web涉及的文件上传和下载功能. 正文 1. java原生servlet实现: pom.xml配置: <dependency> <groupId>

JAVA SFTP文件上传、下载及批量下载

1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. SFTP(Secure File Transfer Protocol)安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输

CompressUtils相关代码,java中文件压缩或解压已经文件的基本操作等方法

java中一些场合我们需要,对上传的压缩包中的内容进行处理,这个时候就用到了解压操作,还有压缩的操作等等,这里直接贴一下代码,以备今后自己可能会用到,还有共享给需要的小伙伴们. import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExceptio

Java实现文件的上传下载(含源代码和jar包)

1.需要使用的jar包 链接:https://pan.baidu.com/s/1IaxQRSwfzxDpe4w4JiaEKw 提取码:xwtz 2.如果想实现文件的下载,需要创建一张表,表的结构为 id url(id为查找依据,url为文件名即可) 2.文件的上传 该方法我是建立在SpringBoot框架中实现的,实际上这并不是必要的. 主要的是参数file是上传的文件信息,即路径相关.path的路径为获取的,使用与linux与windows系统,如果服务器固定,可以将path路径写成绝对路径.