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

使用Apache POI获取大型excel文件的excel工作表名称

伏德义
2023-03-14

下面的代码用于获取excel文件(.xlsx)的工作表名称

    XSSFWorkbook workBookXlsx = new XSSFWorkbook(new FileInputStream(pathToFile));
    ArrayList<String> sheetNames = new ArrayList<>();

    int numberOfSheets = workBookXlsx.getNumberOfSheets();
    for (int i = 0; i < numberOfSheets; i++) {
        sheetNames.add(workBookXlsx.getSheetAt(i).getSheetName());
    }

    workBookXlsx = null;

上面的代码存在的问题是,为一个9MB大小的文件创建xssfworkbook需要占用大量内存(~700MB)&时间很长(5-6s)。即使将workbookxlsx设置为null也不会释放javaw占用的内存(我知道gc可能被调用,也可能不被调用&JVM不会仅仅因为我将变量设置为null而释放内存)

我确实浏览了Workbook,XSSFWorkbook&根据我的理解,没有任何方法可以帮助我获得内存印记较低的工作表名称。

我找到的一个解决方案是手动解压缩.xlsx文件,并读取.\xl\woorkbook.xml的内容,以获得工作表名称和r:id

是否有一个API来获取.xlsx文件中的工作表名称,而没有大的内存印记?

共有1个答案

沈飞翼
2023-03-14

来说明@gagravarr的评论可能是什么意思:

XSSFReader包含一个方法XSSFReader.getSheetsData,它“返回一个迭代器,该迭代器将让您依次获取所有不同的工作表。每个工作表的输入流只有在从迭代器中获取时才会打开。在处理完每一个工作表后,您才能关闭输入流”。但通常情况下,这并不是全部事实。实际上,它返回一个XSSFreader.SheetIterator,它有一个方法XSSFreader.SheetIterator.GetSheetName来获取工作表名称。

示例:

import java.io.InputStream;
import java.io.FileInputStream;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.XSSFReader;

import java.util.Iterator;

public class ExcelXSSFGetSheetNamesXSSFReader {

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

  OPCPackage pkg = OPCPackage.open(new FileInputStream("Example.xlsx"));
  XSSFReader r = new XSSFReader( pkg );
  Iterator<InputStream> sheets = r.getSheetsData();

  if (sheets instanceof XSSFReader.SheetIterator) {
   XSSFReader.SheetIterator sheetiterator = (XSSFReader.SheetIterator)sheets;

   while (sheetiterator.hasNext()) {
    InputStream dummy = sheetiterator.next();

    System.out.println(sheetiterator.getSheetName());

    dummy.close();
   }
  }

  pkg.close();
 }
}

结论:当前,您不能仅通过信任API文档来使用ApachePOI。相反,您必须始终查看源代码。

 类似资料:
  • 问题内容: 我有以下代码用于获取excel文件的工作表名称(.xlsx) 我上面的代码存在的问题是,为9MB大小的文件创建文件需要花费大量内存(〜700MB)和较长时间(5-6s)。即使将设置为,也不会释放占用的内存(我知道可能会叫,也可能不会叫&JVM不会因为我将变量设置为null而释放内存) 我确实浏览了Workbook,XSSFWorkbook的文档,据我了解,没有任何方法可以帮助我获得内存

  • 我正在尝试阅读大型Excel文件(大小约10MB,. xlsx)。 我正在使用下面的代码 但它显示了堆内存问题。 我还看到了StackOverflow的其他解决方案,其中一些是为了增加JVM,但我不想增加JVM。 问题1)我们不能使用,因为这仅用于编写或创建新工作簿。 我的唯一目标是获取工作表的命名范围的数量,工作表的总数及其大型Excel文件的工作表名称。

  • 我在用图书馆 我在努力 库,但无法将其转换为工作簿 注意:在最终结果中,我希望返回XSSFWorkbook 上面的代码会内存溢出,任何帮助都将提前感谢

  • 问题内容: 尝试使用ApachePOI打开Excel时,我得到 我检查了。没有创建这样的文件夹。我正在使用Apache POI 3.6版。 有什么帮助吗?类似的代码在其他工作区中运行良好。在这里不知所措。 码: 问题答案: 您为什么要制作一个非常好的文件,将其包装在中,然后要求POI必须为您缓冲整个文件,以便可以进行随机访问?如果直接将文件直接传递给POI,生活会好很多,因此可以根据需要跳过它!

  • 用户可以将Excel文档保存为. xls或xml-table。结果是一个具有固定结构的xml-file,Excel可以用它纠正工作。 可以用java中的ApachePOI打开这种类型的excel文件吗? 事先谢谢你,安德烈。

  • 问题内容: 如何使用Apache POI在Excel文件中获取列名,以确保按预期顺序排列列。 问题答案: 或这个: 行索引从0开始。