JAVA使用POI如何导出百万级别数据

经常使用Excel的人应该都能知道excel2007及以上版本可以轻松实现存储百万级别的数据,但是系统中的大量数据如何能够快速准确的导入到excel中这好像是个难题,对于一般的web系统,我们为了解决成本,基本都是使用的入门级web服务器tomcat,jdk在32为系统中支持的内存不能超过2个G,但是在64为中没有限制,但是在64位的系统中,性能并不是太好,所以为了解决上诉问题,我们要针对我们的代码来解决我们要解决的问题,在POI3.8之后新增加了一个类,SXSSFWorkbook,它可以控制excel数据占用的内存,他通过控制在内存中的行数来实现资源管理,当超过了设定的行数,他会自动刷新内存,将数据写如文件。但有人会说了,我用过这个类啊,他好像并不能完全解决,当数据量超过一定后还是会内存溢出的,而且时间还很长。对你只是用了这个类,但是你并没有针对你的需求进行相应的设计,仅仅是用了,所以接下来我要说的问题就是,如果通过SXSSFWorkbook以及相应的写入设计来实现百万级别的数据快速写入。

我先举个例子,以前我们数据库中存在大量的数据,我们要查询,怎么办?我们在没有经过设计的时候是这样来处理的,写一个集合,然后执行jdbc,将返回的结果赋值给list,然后在返回到页面上,但是当数据量大的时候,会出现数据无法返回,内存溢出的情况,于是我们在有限的时间和空间下,通过分页将数据一页一页的显示出来,这样可以避免了大数据量数据对内存的占用,也提高了用户的体验性,在我们要导出的百万数据也是一个道理,内存突发性占用,我们可以限制导出数据所占用的内存,我们建立一个容器,这个容器是一个list,list中开辟10000行的存储空间,每次存储10000行,用完了将内容清空,然后重复利用,这样就可以有效控制内存,所以我们的设计思路就基本形成了,所以分页数据导出共有以下3个步骤:

  1. 求数据库中待导出数据的行数
  2. 根据行数求数据提取次数
  3. 按次数将数据写入文件

通过以上步骤在效率和用户体验性上都有了很高的提高,接下来上代码

	public void exportAmountExcelData(ValueDataDto valueDataDto,
			String path) throws IOException {
		SXSSFWorkbook wb = new SXSSFWorkbook(15);
		Sheet sh = wb.createSheet();
		Row row = sh.createRow(0);
		// --------------------------------------------------
		Cell cel0 = row.createCell(0);
		cel0.setCellValue("1");
		Cell cel2 = row.createCell(1);
		cel2.setCellValue("2");
		Cell cel3 = row.createCell(2);
		cel3.setCellValue("3");
		Cell cel4 = row.createCell(3);

		// ------------------定义表头----------------------------------------
		List<ValueDataBean> list = new ArrayList<ValueDataBean>();
		int page_size = 10000;// 数据库中存储的数据行数
		int list_count = this.daoUtils.queryListCount(this.valueDataDao
				.queryExportSQL(valueDataDto).get("count_sql"));
		int export_times = list_count % page_size > 0 ? list_count / page_size
				+ 1 : list_count / page_size;
		for (int j = 0; j < export_times; j++) {
			list = this.valueDataDao.queryPageList(this.valueDataDao
					.queryExportSQL(valueDataDto).get("list_sql"), j + 1,
					page_size);
			int len = list.size() < page_size ? list.size() : page_size;
			for (int i = 0; i < len; i++) {
				Row row_value = sh.createRow(j * page_size + i + 1);
				Cell cel0_value = row_value.createCell(0);
				cel0_value.setCellValue(list.get(i).getaa());
				Cell cel2_value = row_value.createCell(1);
				cel2_value.setCellValue(list.get(i).getaa());
				Cell cel3_value = row_value.createCell(2);
				cel3_value.setCellValue(list.get(i).getaa_person());
			}
			list.clear();
		}

		FileOutputStream fileOut = new FileOutputStream(path);
		wb.write(fileOut);
		fileOut.close();
		wb.dispose();
	}
时间: 2024-08-12 16:14:20

JAVA使用POI如何导出百万级别数据的相关文章

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

php - 从数据库导出百万级数据(CSV文件)

将数据库连接信息.查询条件.标题信息替换为真实数据即可使用. <?php set_time_limit(0); ini_set('memory_limit', '128M'); $fileName = date('YmdHis', time()); header('Content-Encoding: UTF-8'); header("Content-type:application/vnd.ms-excel;charset=UTF-8"); header('Content-Dis

用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件

转自:http://blog.csdn.net/think2me/article/details/12999907 1. 说说csv 和 Excel 这两者都是我们平时导出或者导入数据一般用到的载体.两者有什么区别呢?csv 格式更兼容一点.那么共同点都是GBK格式的,非UTF8.所以我们上传文件的时候,老是出现乱码,就是编码问题没有转好导致. 2. 推荐的几种方法 1. 函数 fgetss($handel);  返回字符串.它就是strip_tags(fget($handel))的组合读取cs

java 使用POI导出百万级数据

先看结果吧,这只是测试其中有很多因数影响了性能. 表总数为:7千多万,测试导出100万 表字段有17个字段 最终excel大小有60多兆 总耗时:126165毫秒 差不多2分多钟 其核心简单来说就是分批写入,就是分页一样.这样的好处就是不会内存溢出. (真的不会写博客...) 直接上代码了 public void download(HttpServletResponse response) throws Exception{ // 一次读取的数量 int listCount = 200000;

php 连接oracle 导出百万级数据

1,我们一般做导出的思路就是,根据我们想要的数据,全部查询出来,然后导出来,这个对数据量很大的时候会很慢,这里我提出来的思想就是分页和缓冲实现动态输出. 2.普通的我就不说了,下面我说一下分页和内存刷新思想.代码如下: $conn = oci_connect('fin_data', 'fin_data', "(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=192.168.6.65)(PORT = 1521))(CONNECT_DATA =(SID=hqygd

Java千万级别数据生成文件思路和优化

一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去. 程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要生成xml文件的客户资料接近千万级别的程度,而现场对程序的配置大约是100W条数据生成一个xml文件里面去,程序在这样的大数据量下面偶尔会

Java通过POI技术操作Excel(3)----数据导出

在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下: 这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤: 1.连接数据库:2.根据sql语句获取数据库中值:3.将值进行导出操作: 首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了 1 public class DataBase { 2 pri

java使用POI,以excel文件的形式,导出前端表格数据

知识点:前端表格数据,调用后台接口,导出excel文件数据,使用到Apache POI接口 POI提供API给Java程序对Microsoft Office格式档案读和写的功能. (1)在pom.xml中引入POI和文件读写相关的包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId></dependency> <depend

JAVA笔记-如何向Excel表单中高效的批量写入百万条数据

今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表. 当时我的第一个念头就是这真的是一个好疯狂的念头.然后就想假如真的有这样类似的需求,我自己应该怎么做呢? ps: 首先科普一下基础知识 Excel 2003及以下的版本.一张表最大支持65536行数据,256列.也就是说excel2003完全不可能满足百万数据导出的需求. Excel 2007-2010版本.一张表最大支持1048576行,16384列: 笔者使用的是office 2010,更高的版本笔者没有使用过,暂