Apache POI流式传输(SXSSF)用于阅读

我需要读取大型Excel文件并将其数据导入到我的应用程序中。

由于POI会占用大量的堆工作,经常会引发OutOfMemory错误,因此我发现有一个

API以串行方式处理excel数据(而不是将文件完全加载到内存中)

我创建了一个xlsx工作簿,其中包含一个工作表,并在单元格中键入了多个值,并提出了以下代码来尝试读取它:

public static void main(String[] args) throws Throwable {

// keep 100 rows in memory, exceeding rows will be flushed to disk

SXSSFWorkbook wb = new SXSSFWorkbook(new XSSFWorkbook(new FileInputStream("C:\\test\\tst.xlsx")));

SXSSFSheet sheet = (SXSSFSheet) wb.getSheetAt(0);

Row row = sheet.getRow(0);

//row is always null

while(row.iterator().hasNext()){ //-> NullPointerException

System.out.println(row.getCell(0).getStringCellValue());

}

}

但是,尽管能够正确获取其工作表,但它始终带有空(null)行。

我已经研究并找到了Internet上Streaming API的几个示例,但是它们都与 现有文件无关,它们都与生成excel文件有关。

实际上是否可以从.xlsx流中的现有文件中读取数据?

回答:

在深入研究之后,我发现了这个库:

如果您过去使用过Apache

POI来读取Excel文件,您可能会注意到它的内存效率不是很高。阅读整个工作簿将导致严重的内存使用高峰,这可能会对服务器造成严重破坏。

为什么要在整个工作簿中读取Apache,有很多充分的理由,但是大多数原因与该库允许您使用随机地址进行读取和写入有关。如果(并且仅)您只想以快速且高效的内存方式读取Excel文件的内容,则可能不需要此功能。不幸的是,POI库中唯一可读取流工作簿的内容要求您的代码使用类似SAX的解析器。该API缺少所有友好类(如Row和Cell)。

该库用作该流API的包装,同时保留了标准POI API的语法。继续阅读以了解它是否适​​合您。

InputStream is = new FileInputStream(new File("/path/to/workbook.xlsx"));

StreamingReader reader = StreamingReader.builder()

.rowCacheSize(100) // number of rows to keep in memory (defaults to 10)

.bufferSize(4096) // buffer size to use when reading InputStream to file (defaults to 1024)

.sheetIndex(0) // index of sheet to use (defaults to 0)

.sheetName("sheet1") // name of sheet to use (overrides sheetIndex)

.read(is); // InputStream or File for XLSX file (required)

还有一个SAX Event API,它通过事件读取文档并解析其内容。

如果内存占用量是一个问题,那么对于XSSF,您可以获取基础XML数据并自行处理。这是为那些愿意学习.xlsx文件的低级结构并且乐于使用Java处理XML的中级开发人员准备的。它使用起来相对简单,但是需要对文件结构有基本的了解。所提供的优点是您可以读取内存占用相对较小的XLSX文件。

以上是 Apache POI流式传输(SXSSF)用于阅读 的全部内容, 来源链接: utcz.com/qa/430770.html

回到顶部