跳过excel行的最高效的方法?

时间:2017-08-23 09:32:27

标签: java apache-poi

我有一个Java EE WebApplication并且我正在使用文件上传机制,所以在上传文件并发送到我的服务器之后,我使用apache POI来读取excel文件并将数据存储在db中。文件有时可能非常大,包含大量数据,有时甚至超过一百万行。所以我需要一个进度条。为此,我应用了一个自定义技术,现在当文件很大时,这会导致一个性能问题。

我正在做的是每次调用我的方法时从第0个索引读取所有行,并且我不跳过之前保存的行。

以下是我的方法的片段:

   Sheet firstSheet = workbook.getSheetAt(0);
                Iterator<Row> iterator = firstSheet.iterator();
                totalRows.value = firstSheet.getLastRowNum();
                // Insert All Rows From Excel To Source Table
                Row nextRow = null;
                int rowsSaved = 0;
                int rowsSkipped = 0;
                int readRowSize = (int) (((int) totalRows.value * 2.5) / 100);
                while (iterator.hasNext() && rowsSaved <= readRowSize) {
                    nextRow = iterator.next();
                    rowsSkipped++;

                    if (rowsSkipped > (int) rowNum.value) {
                        rowNum.value++;
                        rowsSaved++;
    // save data in db
    }
    }

我无法使用方法

   firstSheet.getRow(index);

因为我使用不允许此方法的特定库并抛出

的限制
UnsupportedMethodException

我的图书馆是:

import com.monitorjbl.xlsx.StreamingReader;
// other poi libraries are
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

我正在使用这个库,因为它允许我读取大的excel文件。如果我使用:

WorkBook myworkbook = new XSSFWorkBook(file);

然后它会卡在大小为8-10mb或更大的文件上,但在这种情况下我可以使用“getRow”方法;

读取文件的代码是:

File f = new File(fullPath);
            Workbook workbook = StreamingReader.builder()
                    .rowCacheSize(Constants.READ_ROW_SIZE) // number of rows to
                                                            // keep in memory
                                                            // (defaults to 10)
                    .bufferSize(1024) // buffer size to use when reading
                                        // InputStream to file (defaults to
                                        // 1024)
                    .open(f); // InputStream or File for XLSX file (required)

最后,如果我的文件很大并且有大量数据,即超过一百万条记录,那么约为50%,即当保存近五十万条记录时,它会变得更慢更慢,因为它首先必须跳过行。我试图实现一个自定义迭代器,如果这可以让我跳转到一个特定的记录,但我找不到更好的解决方案。我发现的解决方案是将迭代器转换为arrayList并跳转到自定义Iterator类中的记录,但该转换也将成为性能主管。

因此,如果任何人有更好的解决方案,那么请分享。

0 个答案:

没有答案