`
- 浏览:
191443 次
- 性别:
- 来自:
商丘
-
说明:我的电脑 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 QQ:三二8二4七6七六
*
*/
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 QQ:三二8二4七6七六
*
*/
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 QQ:三二8二4七6七六
*
*/
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 QQ:三二8二4七6七六
*
*/
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,给力吧
以后记得代码加注释
亲,记得给个评论哦
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
标题中的“用Poi导出Excel表格数据”指的是使用Apache POI库来创建和操作Microsoft ...在实际开发中,结合标签中的“源码”和“工具”,可以结合其他Java库或框架,如Spring,构建出高效、灵活的Excel处理解决方案。
在Java开发中,Excel的导入导出功能是一个常见的需求,特别是在数据处理、报表生成和数据分析等领域。Apache POI是一个强大的库,...在实际开发中,结合上述知识点,我们可以构建出高效、稳定的Excel导入导出解决方案。
综上所述,Apache POI提供了一套完整的解决方案来处理Excel文件,无论是读取模板还是生成新的Excel,都提供了丰富的功能和灵活性。在实际开发中,理解并熟练运用Apache POI,可以大大提高工作效率,特别是在大数据...
在IT领域,数据导出到Excel是一项常见的任务,特别是在数据分析、报表生成以及数据交换中。...在实际使用中,根据具体需求选择合适的编程语言和库,并结合优化技巧,可以创建高效且用户友好的数据导出解决方案。
它提供了一整套高效便捷的Excel导入导出解决方案,支持复杂表头、单元格样式、图片、公式、校验和批注等功能,并能处理多sheet、单元格合并以及模板导出等高级特性,旨在简化用户对POI库的使用,降低上手难度。
POI ,xdocreport框架是一个半成品,往往使用默认的解析结果无法满足业务需求,花了很长时间和心血研究了其源码,修复了以下问题 问题1: xdocreport能解析word转html,但解析出来的是基于word的整套html,往往我们的...
这个源码项目对开发者来说非常有用,因为它提供了现成的解决方案,可以节省大量编写和测试代码的时间。同时,它也展示了如何在Spring框架中集成文件I/O操作和第三方库,对于学习和提升Java编程技能大有裨益。不过,...
这个项目“Excel-template-exportJava实用源码整理learns”提供了相关的解决方案。下面我们将详细探讨如何在Java中实现数据导出到指定的Excel模板。 首先,你需要了解Java处理Excel的基本库,如Apache POI。Apache ...
这个资源包“NPOI-Excel导入导出(源码+实例)”提供了全面的解决方案,帮助C#开发者在MVC和其他模式下实现Excel数据的导入与导出功能。以下是对NPOI库及其在Excel操作中的应用的详细解释: 1. **NPOI库介绍** ...
总的来说,这个项目提供了一个完整的解决方案,从读取Word模板,填充数据,到生成和导出新的Word文档。通过学习和应用这个项目,开发者可以更好地掌握Java环境下使用Apache POI处理Word文档的能力,提升自动化文档...
总之,这个压缩包提供了一个完整的文件导出解决方案,利用Java的Apache POI库实现了Excel文件的生成,并通过控制器处理前端请求,使用户能够方便地导出数据到Excel表格。这个过程涉及到后端开发、文件操作、网络通信...
使用这个源码,开发者可以快速构建自己的Excel和数据库之间的数据交换解决方案,而无需从零开始编写所有基础代码。同时,由于源码可用,可以进行二次开发,满足特定需求,比如性能优化、错误处理机制的改进,或者...
【标题】"POI教程"涉及的是Apache POI库在Java中处理Microsoft Office...通过这些知识点的学习,开发者可以熟练掌握使用Apache POI进行Java与Excel交互的技能,提升工作效率,并为处理大规模Excel数据提供解决方案。
在博文链接(虽然这里没有给出具体内容)中,可能会详细介绍某个特定的源码实现或工具的使用方法,包括示例代码、最佳实践或常见问题解决方案。 总结来说,“导出数据”是一个广泛的话题,涵盖了编程技术、工具使用...
- **性能优化**:对于大量数据的导出,考虑使用批处理或异步处理来提高效率。 了解并掌握这些知识,你就能灵活地利用FreeMarker和Word模板实现自动化文档生成,极大地提高工作效率。在实际项目中,还可以根据具体...
标题中的“以SWT为界面,用POI读取、修改excel文件(源码)”指的是一个Java编程项目,它利用了两种主要的技术:SWT(Standard...通过这种方式,开发者可以利用Java的强大功能和跨平台特性,为各种业务需求提供解决方案。
此外,云计算服务如AWS Glue、Google Cloud Dataflow或Azure Data Factory提供了基于云的解决方案,用于跨不同云服务和本地系统进行大规模数据迁移和导出。 总的来说,“数据导出”是一个涵盖广泛的话题,涉及到从...
在IT行业中,压缩包是一种常见的数据传输和存储方式,尤其在开发环境中,它能有效地整理和分享代码、资源文件等。本案例中的“导出压缩包...对于开发者来说,掌握这些技能有助于构建高效且用户友好的数据导出解决方案。
综上所述,“platform-plus_POI_platform-plus_源码和ui_plus_”项目是一个集成了前端Vue、后端Java、POI数据处理、代码生成器和权限管理的综合性开发平台,旨在提供一站式的解决方案,帮助开发者快速构建功能完善的...
标题提到的"导出数据库的表结构到Excel"就是一个这样的解决方案,它提供了一种方法将数据库中的表结构信息转换成Excel表格,便于分享、审查或进一步处理。 这个源码包和Release包可能包含了一个应用程序或者一组...