转载http://javaflex.iteye.com/blog/1264127
说明:我的电脑 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代码 收藏代码
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对象
模拟业务逻辑代码 收藏代码
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<Person> list =new ArrayList<Person>();
for(int i=0;i<100320;i++){
list.add(new Person(i,"zhangsan"+i,"北京"+i,"13214587632",123123.12+i));
}
return list;
}
}
第三、业务处理Servlet
操作servlet代码 收藏代码
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<Person> 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<Person> list, HttpServletRequest request,
int length, String f, OutputStream out) throws IOException {
List<String> fileNames = new ArrayList();// 用于存放生成的文件名称s
File zip = new File(request.getRealPath("/files") + "/" + 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("/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 < min; 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 < 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 util;
压缩工具类代码 收藏代码
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 < 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();
}
}
}
OK全部内容完成
12.8M的excel内容压缩后2.68M,给力吧
以后记得代码加注释
相关推荐
#### 三、导出大量数据到Excel的实现思路 当面对大量数据时,直接将所有数据一次性写入单个工作表可能会导致内存溢出等问题。因此,一种常见的做法是将数据分批写入不同的工作表中。 #### 四、具体实现步骤 ##### ...
在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。下面将详细介绍这个过程。 1. **Apache POI 概述** Apache POI 提供了 Java API 来读写 Microsoft Office ...
以上就是使用Java POI导出Excel的基本步骤。你可以根据实际需求调整代码,例如添加数据遍历、样式设置、图表生成等功能。确保正确管理资源,避免内存泄漏,特别是在服务器端处理大量数据时。记得在完成后关闭工作簿...
### POI的EXCEL导出,自动换行 在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office...
"poi导出excel需要的jar"指的是在使用Apache POI进行Excel导出时,你需要包含特定的JAR依赖文件。 首先,要实现POI导出Excel的功能,你需要下载Apache POI相关的JAR文件。这些文件通常包括以下核心组件: 1. **poi...
这篇博客文章“Apache POI 导出excel实例”将深入探讨如何使用Apache POI库来生成Excel文件,这对于在Java环境中处理大量数据并需要导出为Excel格式的应用非常有用。 首先,我们需要导入Apache POI库到我们的项目中...
在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...
以下是一个简单的使用Apache POI导出Excel的工作流程示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java....
在使用Apache POI导出Excel时,首先需要创建一个`XSSFWorkbook`对象作为工作簿,然后通过工作簿创建`XSSFSheet`对象代表工作表。例如: ```java XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet =...
### 文件下载:使用POI导出Excel文档 在日常工作中,我们经常需要处理大量数据,并将其以Excel格式导出供用户下载。Java中一个非常强大的工具包——Apache POI可以帮助我们实现这一需求。Apache POI是一个用于读写...
本篇文章将详细介绍如何使用JAVA POI导出Excel。 一、准备工作 在开始编写代码前,确保已经添加了Apache POI库到项目的依赖管理中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...
在利用POI导出数据库到Excel的过程中,主要涉及以下几个步骤: 1. **准备环境**:确保项目中已经引入了Apache POI的依赖。在本例中,你已经有了`poi.jar`包,这通常包含在项目的类路径中。如果使用现代构建工具如...
在Java环境中,如果你需要导出或者操作Excel文档,Apache POI是必不可少的工具。标题提到的"导出excel文档所需要的poi的jar包"正是指这个功能。 Apache POI的版本3.8是较早的一个稳定版本,尽管现在已经有更新的...
在Java编程中,使用...总结起来,Java使用Apache POI导出大量数据需要考虑内存管理、性能优化、样式设置、错误处理等多个方面。通过合理的编程实践和策略,可以确保数据导出既快速又稳定,同时提供良好的用户体验。
在本示例"SSM框架利用poi导入导出Excel文件 demo"中,我们将探讨如何在SSM项目中使用Apache POI库来实现Excel文件的导入与导出功能。 Apache POI是一个流行的开源库,它允许开发者在Java应用程序中创建、修改和显示...
标题中的“POI实现的基于动态模板的EXCEL数据导出”是指利用Apache POI库来创建一个可以动态填充数据的Excel模板,从而实现大量数据的高效导出。Apache POI是一个开源项目,它允许Java开发者读写Microsoft Office...
总结一下,Apache POI是Java处理Excel文件的标准库,它提供了全面的API来实现Excel的导入和导出。通过理解并熟练使用POI,开发者可以轻松地在应用程序中实现Excel数据的读取、写入和编辑功能。结合dim4j库,还能进行...
在本文中,我们将深入探讨如何使用POI库来导出Excel文件,这在大数据处理、报表生成和数据交换等场景中非常常见。 首先,让我们了解什么是Apache POI。POI是“Poor Obfuscation Implementation”的首字母缩写,它...
在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...