当我在循环中执行Apache POI时,不会创建新工作表

时间:2018-03-08 07:47:42

标签: java spring apache hibernate apache-poi

当我将大量数据写入具有多个工作表的Excel文件时,我遇到了一个问题。我正在使用apache POI进行excel导出。

    File file = new File("../path/file.xls");
    FileOutputStream fout = new FileOutputStream(file);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    int limit = 100000,offset=0,count=0,sheetIndex=0;
    XSSFWorkbook workbook = new XSSFWorkbook();
    do{

        XSSFSheet sheet = null;
        if (file.exists() && sheetIndex > 0) {
            try {
                workbook = (XSSFWorkbook)WorkbookFactory.create(file);
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            }
            sheet = workbook.createSheet("Sheet-"+sheetIndex);
        }else{
            workbook = new XSSFWorkbook();
            sheet = workbook.createSheet("Sheet-"+sheetIndex);
        }
        Row header = sheet.createRow(0);
        //...Header row creation...
        List<DataType> result = query(criteria,offset,limit);
        offset = offset + limit;
        count = results.size();
        sheetIndex++;
        int rowCount = 1;
        for(DataType rowData : results){
            Row row =  sheet.createRow(rowCount++);
            //row creation....
        }
        try {
            workbook.write(outputStream);
            outputStream.writeTo(fout);
        } finally {
            outputStream.flush();
        }

    }while(count == limit);

    workbook.write(outputStream);
    outputStream.writeTo(fout);
    outputStream.close();
    fout.close();

在循环中,我从DB获取100k记录并将其写入excel,每100k我创建一个新的Sheet,直到DB没有更多记录。

此代码有2个问题 1.我在打开文件时遇到问题,excel文件提醒我,当我尝试打开时它有问题,最后当我说好的时候加载数据。

  1. 虽然我的数据库包含240M记录,但我看到只有1张100k数据。我也可以看到循环循环多次。
  2. 如何解决这些问题?真的被困了!

    提前致谢。

2 个答案:

答案 0 :(得分:4)

XSSFWorkbook workbook被多次创建,它会覆盖在前一个循环中创建的那个。工作簿只需创建一次。

我建议将循环条目更改为以下内容:

XSSFWorkbook workbook = new XSSFWorkbook();
do {
    XSSFSheet sheet = workbook.createSheet("Sheet-"+sheetIndex);
    Row header = sheet.createRow(0);
    //...Header row creation...
    // remaining code

答案 1 :(得分:0)

我已将WorkBook类型更改为SXSSFWorkbook并将刷新限制设置为100并且它有效。 性能比XSSFWorkbook好5倍。