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

Jitin Kodian:

我有以下代码用于获取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;

我上面的代码存在的问题是,XSSFWorkbook为9MB大小的文件创建文件需要花费大量内存(〜700MB)和较长时间(5-6s)即使将设置为workBookXlsxnull也不会释放占用的内存javaw(我知道gc可能会叫,也可能不会叫&JVM不会因为我将变量设置为null而释放内存)

我确实浏览了WorkbookXSSFWorkbook的文档我了解,没有任何方法可以帮助我获得内存烙印少的工作表名称。

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

是否有一个API可以在.xlsx文件中获取工作表名称而不会产生较大的内存烙印?

阿克塞尔·里希特(Axel Richter):

为了显示@Gagravarr的评论可能意味着什么:

XSSFReader包含方法XSSFReader.getSheetsData其中“返回一个迭代器,这将让你在把所有的不同的表,每个表的InputStream中只有打开时开始迭代器牵强。这是给你的时候,每个做关闭InputStreams之一。”。但是通常这不是全部。实际上,它返回一个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();
 }
}

结论:当前,您不能apache poi仅通过信任API文档来进行处理。相反,您必须始终查看源代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Apache POI在Excel文件中获取列名称

使用Apache POI删除Excel工作表

使用Apache POI复制Excel工作表

使用工作表名称获取我的Excel文件的FilePath

是否可以使用Apache POI更改工作表名称MS excel Java android

如何使用Apache POI获取Java中Excel工作表各行的最后一列值

如何使用Apache POI 3.6在Excel工作表中获取超过255列

使用Apache Poi从Excel工作表中获取单元格值

使用Apache POI将文件嵌入Excel中的XSSF工作表

使用 Apache POI 将工作表附加到 Excel 文件 - NullPointerException 引起的 POIXMLException

使用Apache POI从Excel文件中获取列?

通过Apache POI读取大型Excel文件(xlsx)时出错

使用 Apache POI 获取 Excel 填充颜色

如何使用xlrd在Python中获取Excel工作表名称

如何使用 SXSSF Apache POI 向现有的大型 Excel 文件添加列?

使用Apache POI更新Excel文件

无法使用Apache POI从Excel文件读取

使用Apache POI更新基于CSV工作表的Excel工作表值

使用SAS确定Excel文件工作表名称的快速方法?

使用POI将大型结果集写入Excel文件

如何使用Java Apache POI在Excel工作表中隐藏以下未使用的行?

如何使用Win32ole Gem在Rails上使用ruby在Excel文件中获取工作表的名称?

使用Apache POI向Excel写入会损坏Excel文件

使用Apache POI从Java中的Excel工作表中读取数据

使用Apache POI删除特定Excel工作表上的所有边框

如何使用apache-poi将Excel工作表中的值设置为Pojo对象?

如何使用Apache POI为Excel工作表中的行应用背景颜色?

如何使用Apache POI在Excel工作表中搜索特定日期?

使用Apache POI将自定义颜色添加到Excel工作表