gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:05:09 30 4
gpt4 key购买 nike

我有以下代码用于获取 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-6 秒)才能为大小为 9MB 的文件创建 XSSFWorkbook。即使将 workBookXlsx 设置为 null 也不会释放 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();
}
}

结论:目前您无法仅通过信任 API 文档来使用 apache poi。相反,您必须始终查看 source code .

关于java - 使用 Apache POI 获取大型 excel 文件的 excel 工作表名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47453102/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com