常见报表开发工具POI和JXL(JExcel)。本文采用JXL实现导出Excle功能。Excle-2003中对每个工作表的数据量大小有限制,行数最大限制为65536行,列数最大限制为256列。一个工作薄(workbook)可以有多个工作表(sheet)。
实现大批量数据导出Excel的方法
- 导出csv格式的数据
缺点:数据格式不能保证
优点:操作简单
- 导出多个中间文件,将多个中间文件合并
缺点:一个中间文件只能有一个工作表(sheet),合并文件也要耗时。
优点:只要设定好每次请求数据大小,几乎不存在内存溢出问题。
- 导出一个文件,循环分页请求数据,写入excel是分多个工作表(sheet)写入
缺点:对于大量数据虽然利用循环分页的形式处理了一次性读取数据引发的内存溢出问题,但是,由于JXL在写入excel是,都是一次性写入的,所以还是回出现内存溢出问题。
优点:能够实现10万条以内数据导出。
- 导出一个Excel文件的xml形式,另存为.xls文件
缺点:
优点:
实现第3种方法,实现思路:
- 创建一个workbook,先设定导出参数,每次从数据库请求的数据条数,每个工作表放置的最大行数,根据查询记录总数 / 每次请求记录数 = 循环分页请求数据次数。
- 请求后台得到数据,对数据合法性进行保证,jxl导出是,数据字段不能为null。
- 读取数据,创建一个sheet,如果当前的行数大于最大设定行数,则新建一个sheet写入。将数据不断转换为sheet中的单元格label对象。
- 请求数据结束,调用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