java poi导出Excel表格超大数据量解决方案

Java实现导出excel表格功能,大部分都会使用apache poi,apache poi API 地址 
POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。 
3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。 
代码: 
git地址 有3.9jar包

package qs.test;
 
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 
/**
 * ClassName: SXSSFTest
 * @Description: TODO
 * @author qiaoshuai
 */
public class SXSSFTest {
 
    public static void main(String[] args) throws IOException {
        // 创建基于stream的工作薄对象的
        SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
                                                    // exceeding rows will be
                                                    // flushed to disk
        // SXSSFWorkbook wb = new SXSSFWorkbook();
        // wb.setCompressTempFiles(true); // temp files will be gzipped
        Sheet sh = wb.createSheet();
        // 使用createRow将信息写在内存中。
        for (int rownum = 0; rownum < 1000; rownum++) {
            Row row = sh.createRow(rownum);
            for (int cellnum = 0; cellnum < 10; cellnum++) {
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }
 
        }
 
        // Rows with rownum < 900 are flushed and not accessible
        // 当使用getRow方法访问的时候,将内存中的信息刷新到硬盘中去。
        for (int rownum = 0; rownum < 900; rownum++) {
            System.out.println(sh.getRow(rownum));
        }
 
        // ther last 100 rows are still in memory
        for (int rownum = 900; rownum < 1000; rownum++) {
            System.out.println(sh.getRow(rownum));
        }
        // 写入文件中
        FileOutputStream out = new FileOutputStream("G://sxssf.xlsx");
        wb.write(out);
        // 关闭文件流对象
        out.close();
        System.out.println("基于流写入执行完毕!");
    }
 
}

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

 

private void setSheetFinishStyle(Sheet sheet, int colSize)
{
    for (int i = 0; i < colSize; i++)
    {
        if ((sheet instanceof SXSSFSheet)) {
            ((SXSSFSheet)sheet).trackAllColumnsForAutoSizing();
        }
        sheet.autoSizeColumn((short)i);
    }

    sheet.createFreezePane(0, 1, 0, 1);
}

你可能感兴趣的:(java poi导出Excel表格超大数据量解决方案)