java中生成30万的excel(采用多个excel,每个上面放6万数据,最后打包zip保存)

首先要说明的是excel03  每个sheet最多放65535行所以,每行不能超过这个数,如果想放的多,可以考虑生成excel2007,

好像excel2007可以放100W多行数据

 

大数据量生成excel我只想到三种方法,当然基本也是网上看到的

1  生成多个excel打包   2  利用xml方式生成   3  用最新的包 

现在讲的是第一种  第二种也可以以后会做下测试   第三种好像不行,一直内存溢出

直接上代码

 

这个是servlet:

package servlets;
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.hssf.util.CellRangeAddress; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CellStyle; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook;
import util.DBConnectionManager;
import domain.Person;
public class exportExcel extends HttpServlet {
 private String fileName;
 public void destroy() {
  super.destroy(); // Just puts "destroy" string in log 
  // Put your code here 
 }
 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
  // 文件名获取 
  Date date = new Date();
  SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
  String f = "Person-" + format.format(date);
  this.fileName = f;
  setResponseHeader(response);
  OutputStream out = null;
  try {
   System.out.println("导出excel开始~~~"+System.currentTimeMillis());
   long startTime = System.currentTimeMillis();
   out = response.getOutputStream();
   DBConnectionManager db = new DBConnectionManager();//该部分是用于链接数据库
   List<Person> list = db.queryDataList(" select * from TEST_EXPORT ");//查询数据集合
   toExcel(list, request, 50000, f, out);
   System.out.println("导出excel结束~~~"+System.currentTimeMillis());
   long endTime = System.currentTimeMillis();
   
   System.out.println("导出excel共花费时间~~~"+(endTime-startTime)/1000);
   
  } catch (IOException e1) {
   e1.printStackTrace();
  } finally {
   try {
    out.flush();
    out.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 /** 设置响应头 */
 public void setResponseHeader(HttpServletResponse response) {
  try {
   response.setContentType("application/octet-stream;charset=UTF-8");
   response.setHeader("Content-Disposition", "attachment;filename="
   + java.net.URLEncoder.encode(this.fileName, "UTF-8")
   + ".zip");
   response.addHeader("Pargam", "no-cache");
   response.addHeader("Cache-Control", "no-cache");
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
  doGet(request, response);
 }
 public void init() throws ServletException {
  // Put your code here 
 }
 @SuppressWarnings("deprecation")
 public void toExcel(List<Person> list, HttpServletRequest request,
 int length, String f, OutputStream out) throws IOException {
  List<String> fileNames = new ArrayList();// 用于存放生成的文件名称s 
  File zip = new File(request.getRealPath("/excel") + f + ".zip");// 压缩文件 
  // 生成excel 
  for (int j = 0, n = list.size() / length + 1; j < n; j++) {
   Workbook book = new HSSFWorkbook();
   Sheet sheet = book.createSheet("person");
   double d = 0;// 用来统计 
   String file = request.getRealPath("/excel") + "/" + f + "-" + j 
            + ".xls";
   fileNames.add(file);
   FileOutputStream o = null;
   try {
    o = new FileOutputStream(file);
    // sheet.addMergedRegion(new 
    // CellRangeAddress(list.size()+1,0,list.size()+5,6)); 
    Row row = sheet.createRow(0);
    row.createCell(0).setCellValue("ID");
    row.createCell(1).setCellValue("NAME");
    row.createCell(2).setCellValue("REMARK");

    int m = 1;
    for (int i = 1, min = (list.size() - j * length + 1) > (length + 1) ? (length + 1)
      : (list.size() - j * length + 1); i < min; i++) {
     m++;
     Person user = list.get(length * (j) + i - 1);

     row = sheet.createRow(i);
     row.createCell(0).setCellValue(user.getId());
     row.createCell(1).setCellValue(user.getName());
     row.createCell(2).setCellValue(user.getRemark());
    }
//    CellStyle cellStyle2 = book.createCellStyle();
//
//    cellStyle2.setAlignment(CellStyle.ALIGN_CENTER);
//
//    row = sheet.createRow(m);
//
//    Cell cell0 = row.createCell(0);
//
//    cell0.setCellValue("Total");
//
//    cell0.setCellStyle(cellStyle2);
//
//    Cell cell4 = row.createCell(4);
//
//    cell4.setCellValue(d);
//
//    cell4.setCellStyle(cellStyle2);
//
//    sheet.addMergedRegion(new CellRangeAddress(m, m, 0, 3));
   } catch (Exception e) {
    e.printStackTrace();
   }
   try {
    book.write(o);
   } catch (Exception ex) {
    ex.printStackTrace();
   } finally {
    if (o != null){
     
     o.flush();
     o.close();
    }
    
   }
  }
  File srcfile[] = new File[fileNames.size()];
  for (int i = 0, n = fileNames.size(); i < n; i++) {
   srcfile[i] = new File(fileNames.get(i));
  }
  util.FileZip.ZipFiles(srcfile, zip);
  FileInputStream inStream = new FileInputStream(zip);
  byte[] buf = new byte[4096];
  int readLength;
  while (((readLength = inStream.read(buf)) != -1)) {
   out.write(buf, 0, readLength);
  }
  inStream.close();
 }
}
 


 

实体类

package domain;
public class Person {
 
 private String id;
 private String name;
 private String remark;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getRemark() {
  return remark;
 }
 public void setRemark(String remark) {
  this.remark = remark;
 }
 
 
}


 

这个是打包的工具类

package util;
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

public class FileZip {
  /** 
     *  
     * @param srcfile 文件名数组 
     * @param zipfile 压缩后文件 
     */ 
    public static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) { 
        byte[] buf = new byte[1024]; 
        try { 
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream( 
                    zipfile)); 
            for (int i = 0; i < srcfile.length; i++) { 
                FileInputStream in = new FileInputStream(srcfile[i]); 
                out.putNextEntry(new ZipEntry(srcfile[i].getName())); 
                int len; 
                while ((len = in.read(buf)) > 0) { 
                    out.write(buf, 0, len); 
                } 
                out.closeEntry(); 
                in.close(); 
            } 
            out.close(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 

}
 


 

jsp我就传了,

 

另外这个也是我从别的地方转载的,修改了一些地方,也有很多不完善的地方,如果在项目中最好再做优化

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值