使用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; 

我在上面的代码中遇到的问题是需要大量的内存(〜700MB)和很长的时间(5-6s)才能为9MB大小的文件创buildXSSFWorkbook 。 即使将workBookXlsx设置为null也不会释放javaw所占用的内存(我知道gc可能会或可能不会被调用,JVM将不会释放内存,因为我已经将variables设置为null)

我确实经历了Workbook , XSSFWorkbook和我所了解的文档,没有任何方法可以帮助我获得低内存印记的表名。

我发现的一个解决scheme是手动解压缩.xlsx文件并读取.\xl\woorkbook.xml以获取表名和r:id

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

为了向他的评论展示@Gagravarr可能的含义:

XSSFReader包含一个方法XSSFReader.getSheetsData ,它返回一个迭代器,它可以让你依次得到所有不同的表单,每个表单的InputStream只在从Iterator获取的时候打开,你可以closuresInputStreams一。”。 但是,往往这不是全部的事实。 实际上,它返回一个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文档才能使用apache poi 。 相反,您必须始终查看源代码 。