eye alpha java_POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)...

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M

我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出。由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出;但是这种情况也不能解决内存溢出的问题。毕竟数据还是一次性在内存中进行保存的。这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel

首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这样就可以确定导出的Excel的数量,于是我们就可以循环的导出excel并保存在任意的临时目录中。去这样如果内存不够的话虚拟机就会去进行回收已经保存的excel在内存中的空间。

假设我们我们已经成功的生成了多个excel,这时我们怎么把这N个excel文档传到客户端呢?其实一个一个的传也未尝不可,但是考虑那样对用户来说体验不够好,再次多个文件在网络上传输也比较慢。我们可以考虑对生成的几个文件进行压缩,然后传到客户端。

总结一下第一、分批次生成excel第二、压缩后到客户端

下面我把我的一个小实例贴上供大家参考

第一、Person.java 普通javabean

Javabean代码  1bd10cff5ce4da7e86f0a2aa6ef1d6b5.png

package bean;

/**

*

* @author http://javaflex.iteye.com/

*

*/

public class Person {

private Integer id;

private String name;

private String address;

private String tel;

private Double money=0.0;

public Double getMoney() {

return money;

}

public void setMoney(Double money) {

this.money = money;

}

public Person(Integer id, String name, String address, String tel,Double money) {

super();

this.id = id;

this.name = name;

this.address = address;

this.tel = tel;

this.money=money;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}

第二、PersonService模拟业务逻辑循环生成100023个Person对象

模拟业务逻辑代码  1bd10cff5ce4da7e86f0a2aa6ef1d6b5.png

package service;

import java.util.ArrayList;

import java.util.List;

import bean.Person;

/**

*

* @author http://javaflex.iteye.com/

*

*/

public class PersonService {

public static List getPerson(){

List list =new ArrayList();

for(int i=0;i<100320;i++){

list.add(new Person(i,"zhangsan"+i,"北京"+i,"13214587632",123123.12+i));

}

return list;

}

}

第三、业务处理Servlet

操作servlet代码  1bd10cff5ce4da7e86f0a2aa6ef1d6b5.png

package servlet;

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 bean.Person;

import service.PersonService;

/**

*

* @author http://javaflex.iteye.com/

*

*/

public class PersonServlet extends HttpServlet {

private String fileName;

public PersonServlet() {

super();

}

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 {

out = response.getOutputStream();

List list = PersonService.getPerson();

toExcel(list,request,10000,f,out);

} 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

}

public void toExcel(List list, HttpServletRequest request,

int length, String f, OutputStream out) throws IOException {

List fileNames = new ArrayList();// 用于存放生成的文件名称s

File zip = new File(request.getRealPath("/files") + "/" + f + ".zip");// 压缩文件

// 生成excel

for (int j = 0, n = list.size() / length + 1; j 

Workbook book = new HSSFWorkbook();

Sheet sheet = book.createSheet("person");

double d = 0;// 用来统计

String file = request.getRealPath("/files") + "/" + 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("ADDRESS");

row.createCell(3).setCellValue("TEL");

row.createCell(4).setCellValue("Money");

int m = 1;

for (int i = 1, min = (list.size() - j * length + 1) > (length + 1) ? (length + 1)

: (list.size() - j * length + 1); i 

m++;

Person user = list.get(length * (j) + i - 1);

Double dd = user.getMoney();

if (dd == null) {

dd = 0.0;

}

d += dd;

row = sheet.createRow(i);

row.createCell(0).setCellValue(user.getId());

row.createCell(1).setCellValue(user.getName());

row.createCell(2).setCellValue(user.getAddress());

row.createCell(3).setCellValue(user.getTel());

row.createCell(4).setCellValue(dd);

}

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 {

o.flush();

o.close();

}

}

File srcfile[] = new File[fileNames.size()];

for (int i = 0, n = fileNames.size(); 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 util;

压缩工具类代码  1bd10cff5ce4da7e86f0a2aa6ef1d6b5.png

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

/**

*

* @author http://javaflex.iteye.com/

*

*/

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 

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();

}

}

}

OK全部内容完成

448dfda241affcb847e97fd388b3ddb2.png

36ca48eb91cb74c780e1e711368b5b01.png

12.8M的excel内容压缩后2.68M,给力吧

以后记得代码加注释

亲,记得给个评论哦

438da2b0b91de3384eb459cc523dbb99.gif

源码下载地址:http://dl.iteye.com/topics/download/87b5eb63-e4d2-345f-937c-802b88af8432

文章来自:http://javaflex.iteye.com/blog/1264127

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值