poi apache compress实现excel压缩下载

try {
//构造40W条数据
    List<Branch> list =  this.getBranch();
    HSSFWorkbook workbook = Service.createHSSFWorkbook(list);
    String fileName = "中文名字哈哈哈";
    OutputStream out = new BufferedOutputStream(response.getOutputStream()); 
//压缩下载 实测80M 压缩完16M 下载更快些
    if (workbook != null) {
        fileName = fileName+ DateUtil.getExcelDate(new Date()) + ".xls";
        response.setContentType( "application/octet-stream ");  
        response.setHeader("Content-Disposition","attachment;filename=\""+  java.net.URLEncoder.encode(fileName, "UTF-8")+".zip"+"\"");
        ArchiveOutputStream archOuts = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP,new BufferedOutputStream(out));  
        ZipArchiveOutputStream zipOut=(ZipArchiveOutputStream)archOuts; 
        ZipArchiveEntry zipEntry=new ZipArchiveEntry(fileName);  
        zipOut.putArchiveEntry(zipEntry);  
        workbook.write(zipOut);
        zipOut.closeArchiveEntry();  
      zipOut.flush();  
      zipOut.finish();  
      out.close();    
}
} catch (Exception e) {
logger.error("Controller>>>>>>>>>>>>>报表下载失败",e);
}
//生成workbook 
@Override
public HSSFWorkbook createHSSFWorkbook(List<Branch> list) {
    HSSFWorkbook workbook = new HSSFWorkbook();
    long totle = list.size();//获取总数,在excel分页
    float res=Float.parseFloat(String.valueOf(totle));  
    int mus=40000;  //xls文件一个sheet最多有65536条数据 
    float avg=res/mus;  //分多少sheet页
    
    for (int k = 0; k < avg; k++) {
    HSSFSheet sheet = workbook.createSheet("第"+k+"页");
    sheet.setDefaultColumnWidth(30);  
    sheet.setDefaultRowHeightInPoints(20); 
    HSSFCellStyle style = workbook.createCellStyle();
        // 创建字体对象   
    Font ztFont = workbook.createFont(); 
    HSSFRow row = sheet.createRow(0);
    String[] headers = { "机构编号", "机构名称", "机构级别", "父机构名称", "机构负责人", "机构负责人联系方式", "机构状态", "座机电话"};
    for (short i = 0; i < headers.length; i++) {
        HSSFCell cell = row.createCell(i);
        HSSFRichTextString text = new HSSFRichTextString(headers[i]);
        cell.setCellValue(text);
}
//处理循环sheet页

    List<Branch> tempList = null;
    int last = (int)(avg);
    if(k==(last-1)){
    int index  = (int) (k*mus);
    //tempList = list.subList(index, list.size());
    //解决subList导致内存不回收,内存溢出
    tempList = this.MySubList(list,index,list.size());
    }else{
    int index  = (int) (k*mus);
    //tempList = list.subList(index,index+mus);
    tempList = this.MySubList(list,index,index+mus);
    }
    for (int i=1,j=0;j<tempList.size();i++,j++) {
        row = sheet.createRow(i);
        Branch br = tempList.get(j);
        HSSFCell cell = row.createCell(0);
        this.setCellStyle(style,ztFont,cell);
        cell.setCellValue(br.getBranchId() == null ? "" : br.getBranchId());
        cell = row.createCell(1);
        this.setCellStyle(style,ztFont,cell);
        cell.setCellValue(br.getBranchName() == null ? "" : br.getBranchName());
        cell = row.createCell(2);
        this.setCellStyle(style,ztFont,cell);
        String branchLevel =  br.getBranchLevel();
        if(branchLevel != null){
        if(branchLevel.equals("1")){
            cell.setCellValue("A");
        }else if(branchLevel.equals("2")){
            cell.setCellValue("B");
        }
    }else{
     cell.setCellValue("");
    }
cell = row.createCell(3);
this.setCellStyle(style,ztFont,cell);
cell.setCellValue(br.getParentbranchName() == null ? "" : br.getParentbranchName());
cell = row.createCell(4);
this.setCellStyle(style,ztFont,cell);
cell.setCellValue(br.getHeaderName() == null ? "" : br.getHeaderName());
cell = row.createCell(5);
this.setCellStyle(style,ztFont,cell);
cell.setCellValue(br.getHeaderPhone() == null ? "" : br.getHeaderPhone());
cell = row.createCell(6);
this.setCellStyle(style,ztFont,cell);
String branchState =  br.getBranchState();
if(branchState != null){
if(branchState.equals("1")){
    cell.setCellValue("启用");
}else if(branchState.equals("2")){
    cell.setCellValue("未启用");
}
}else{
 cell.setCellValue("");
}
cell = row.createCell(7);
this.setCellStyle(style,ztFont,cell);
cell.setCellValue(br.getBranchPhone() == null ? "" : br.getBranchPhone());
}
}
return workbook;
}
时间: 2024-11-13 09:18:05

poi apache compress实现excel压缩下载的相关文章

PHP 从mysql库里取出大量数据写入excel压缩下载

$zip = new ZipArchive;if ($zip->open($filePath . date('Ymd') . '.zip',ZipArchive::OVERWRITE) === TRUE) { $count = $this->mod->getCount($cond); $num = ceil($count/5000);  //取整5000 余数进1 $z = 0; for ($j=0;$j<$num;$j++) { $limit = $j*5000; //每次查询5

poi 架包导出excel,并下载

导出excel在许多系统中都有应用到,这里以两个简单例子作为介绍: 1.导入poi-3.9.jar,可以在官网下载http://poi.apache.org . 2.先写一个简单的测试类,里面有详细的解释,代码如下: 1 import java.io.FileOutputStream; 2 import java.io.IOException; 3 import org.apache.poi.hssf.usermodel.HSSFCell; 4 import org.apache.poi.hss

Apache POI – Reading and Writing Excel file in Java

来源于:https://www.mkyong.com/java/apache-poi-reading-and-writing-excel-file-in-java/ In this article, we will discuss about how to read and write an excel file using Apache POI 1. Basic definitions for Apache POI library This section briefly describe a

apache poi根据模板导出excel

需要预先新建编辑好一个excel文件,设置好样式. 编辑好输出的数据,根据excel坐标一一对应. 支持列表数据输出,列表中列合并. 代码如下: package com.icourt.util; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.user

Java导出excel并下载功能

我们使用的导出并下载功能是利用一个插件叫POI的插件提供的导出功能,很实用:首先先导入Jar包: Jar包下载地址:http://poi.apache.org/   官方文档地址:http://poi.apache.org/spreadsheet/quick-guide.html Action代码: public void exportToExcel(List<PortalContactVO> data) throws Exception { this.setEnableAccessReque

java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式和其他常见Excel中数据转换问题

当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型. 而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式. 那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了. 使用DecimalFormat对这个double进行了格式话,随后使用format方法获得的String就

java使用poi.3.10读取excel 2003 (xls格式)

最近在做一个Excel导入数据库的案例,整理文档出来供大家参考. 1.下载 最新的 poi http://poi.apache.org/download.html 2.解压 把相关jar包引进项目 3.案例源码 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import org.apa

Java基础系列19:使用JXL或者POI生成和解析Excel文件

一 简介 如题所示,当我们需要在Java中解析Excel文件时,可以考虑使用JXL或POI的API来解析. 二者的区别如下: jxl现在基本上没被维护了,最近一次更新时间还是几年前.相反,poi属于Apache开源项目的一部分,更新维护得比较好,最新稳定版 POI 3.15 是今年(2016年)9月更新的,同时poi可以支持更高版本的excel,而jxl只能支持excel2003以及之前的版本 小文件使用jxl解析效率比较高,但是因为支持的excel版本的限制,导致不能导出65535以上量级的数

lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容

在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一.之前做过一个小工具也涉及到读取word和excel内容,采用的是com组件的方式来读取.即导入COM库,引入命名空间(using Microsoft.Office.Interop.Word;using Microsoft.Office.Interop.Excel;),然后读代码如下: 读取word