我有一个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类中的记录,但该转换也将成为性能主管。
因此,如果任何人有更好的解决方案,那么请分享。