POI如何导出百万数据

  Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。简单来说POI就是用来批量操作数据的。

如何实现(SXSSFWorkbook)

POI中的SXSSFWorkbook(XSSF)类,XSSF类采用当数据加工时不是类似前面版本的对象,它可以控制excel数据占用的内存,他通过控制在内存中的行数来实现资源管理,即当创建对象超过了设定的行数,它会自动刷新内存,将数据写入文件,这样导致打印时,占用的CPU,和内存很少。

注意:XSSF类最多支持百万量级别的数据

下面是一个从数据库当中导出大量数据到Excel中的例子:

public void exportBigDataExcel(ValueDataDto valueDataDto, String path)
			throws IOException {
	// 最重要的就是使用SXSSFWorkbook,表示流的方式进行操作
	// 在内存中保持100行,超过100行将被刷新到磁盘
	SXSSFWorkbook wb = new SXSSFWorkbook(100);
	Sheet sh = wb.createSheet(); // 建立新的sheet对象
	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;
<span style="white-space:pre">	</span>	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(); // 每次存储len行,用完了将内容清空,以便内存可重复利用
	}
	FileOutputStream fileOut = new FileOutputStream(path);
	wb.write(fileOut);
	fileOut.close();
	wb.dispose();
}

这样就可以从数据库中导出大量数据到Excel当中了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值