zoukankan      html  css  js  c++  java
  • 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

    版权声明:如需转载,请注明!PS:如是转载随便,请忽略
  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/zwdx/p/8118379.html
Copyright © 2011-2022 走看看