当前位置: 首页 > 知识库问答 >
问题:

用于读取的Apache POI流(SXSSF)

寿伟
2023-03-14

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

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());
    }
}

我在互联网上研究并找到了几个流式API的例子,但它们都不是关于读取现有文件的,它们都是关于生成excel文件的。

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

共有1个答案

夏侯华彩
2023-03-14

又挖了一些,才发现了这个库:

如果您过去使用过Apache POI读取Excel文件,您可能会注意到它的内存效率不高。读取整个工作簿将导致严重的内存使用量峰值,从而对服务器造成严重破坏。

Apache必须阅读整个工作簿的原因有很多,但大多数都与库允许您使用随机地址进行读写有关。如果(并且只有当)您只是想以快速和有效的方式读取Excel文件的内容,您可能不需要这种能力。不幸的是,POI库中用于读取流工作簿的唯一东西要求您的代码使用类似SAX的解析器。该API中缺少所有友好类,如Row和Cell。

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事件API,它读取文档并通过事件解析其内容。

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

 类似资料:
  • 我试图用处理docx文件。只是简单地读取然后写入文件(现在)。这是我的简单代码: 问题是输入文件的头文件中有一个小图像。因此,在使用POI处理输入文件并在Microsoft Word中打开输出文件后,我收到损坏的文件错误: 一切工作在OO Writer,但不是在办公室。 问题是:怎么了?apache POI是否不处理头文件中包含图像的文件?你知道解决这个问题的方法吗? 我需要使用,我不考虑其他工具

  • 嗨,我想在第一行搜索一个字符串,如果找到了,我想移动那一列。

  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 我需要的是一种使用NPOI库打开.xls文件的方法。提前谢了。

  • 本文向大家介绍Java基于IO流读取文件的方法,包括了Java基于IO流读取文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java基于IO流读取文件的方法。分享给大家供大家参考,具体如下: 希望本文所述对大家Java程序设计有所帮助。

  • 问题内容: 我正在尝试使用PySpark 2.4.0从Kafka读取avro消息。 spark-avro外部模块可以为读取avro文件提供以下解决方案: 但是,我需要阅读流式Avro消息。库文档建议使用 from_avro() 函数,该函数仅适用于Scala和Java。 是否有其他模块支持读取从Kafka流式传输的Avro消息? 问题答案: 您可以包括spark-avro软件包,例如使用(调整版本