JXL实现大批量数据循环分页导出Excel研究(三)

本文介绍了使用JXL库在处理大批量数据导出Excel时,通过循环分页和创建多个工作表避免内存溢出的方法。在8万条数据以下能正常导出,但超过该数量会导致内存溢出错误。测试显示,导出过程耗时1710毫秒,而超过8万条数据时,会抛出`java.lang.OutOfMemoryError: Java heap space`异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见报表开发工具POI和JXL(JExcel)。本文采用JXL实现导出Excle功能。Excle-2003中对每个工作表的数据量大小有限制,行数最大限制为65536行,列数最大限制为256列。一个工作薄(workbook)可以有多个工作表(sheet)。


实现大批量数据导出Excel的方法

  • 导出csv格式的数据
缺点:数据格式不能保证
优点:操作简单
  • 导出多个中间文件,将多个中间文件合并
缺点:一个中间文件只能有一个工作表(sheet),合并文件也要耗时。
优点:只要设定好每次请求数据大小,几乎不存在内存溢出问题。
  • 导出一个文件,循环分页请求数据,写入excel是分多个工作表(sheet)写入
缺点:对于大量数据虽然利用循环分页的形式处理了一次性读取数据引发的内存溢出问题,但是,由于JXL在写入excel是,都是一次性写入的,所以还是回出现内存溢出问题。
优点:能够实现10万条以内数据导出。
  • 导出一个Excel文件的xml形式,另存为.xls文件
缺点:
优点:

实现第3种方法,实现思路:

  1. 创建一个workbook,先设定导出参数,每次从数据库请求的数据条数,每个工作表放置的最大行数,根据查询记录总数 / 每次请求记录数 = 循环分页请求数据次数。
  2. 请求后台得到数据,对数据合法性进行保证,jxl导出是,数据字段不能为null。
  3. 读取数据,创建一个sheet,如果当前的行数大于最大设定行数,则新建一个sheet写入。将数据不断转换为sheet中的单元格label对象。
  4. 请求数据结束,调用workbook写入方法,关闭workbook,关闭输出流。

下面是封装后的类:

package com.xsm.pub.tool;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import java.util.Map;


import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 
 * @author 
 * @时间 : 2014-7-24 上午09:23:47  
 * @功能 : TODO 大数据量导出Excel
 */
public class ExportExcelMassData {
	private static final Log log = LogFactory.getLog(ExportExcelMassData.class);

	public int totalSize;//总行数
	public int firstRow = 0; 	// 开始请求数据行号	
	public int getDataTimes;//请求数据次数 totalSize / perPageSize + 1
	
	public int perPageSize = 5000; // 一次请求分页大小
	public int perSheetMaxRows = 10000;	//每个工作表最大行数
	
	public Map mapTitle = null;	//列头
	public Map ma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值