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

我有以下代码用于获取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而释放内存)

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

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

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

回答:

为了显示@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文档来进行处理。相反,您必须始终查看源代码。

以上是 使用Apache POI获取大型Excel文件的Excel工作表名称 的全部内容, 来源链接: utcz.com/qa/422141.html

回到顶部