gpt4 book ai didi

使用 POI 读取 excel 文件 (xlsx) 时出现 java.lang.outofmemory 异常

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:52:00 24 4
gpt4 key购买 nike

我正在开发一个从 excel 文件 (xlsx) 读取数据的网络应用程序。我正在使用 POI 阅读 excel 表。问题是当我尝试读取 excel 文件时,服务器抛出以下错误:

enter image description here

我尝试读取的 excel 文件大小接近 80 MB。这个问题有什么解决办法吗?

实际上用户正在上传文件,应用程序在将文件保存到磁盘后尝试读取文件。我用于测试的代码片段是:

 File savedFile = new File(file_path);

FileInputStream fis = null;
try {

fis = new FileInputStream(savedFile);
XSSFWorkbook xWorkbook = new XSSFWorkbook(fis);
XSSFSheet xSheet = xWorkbook.getSheetAt(5);

Iterator rows = xSheet.rowIterator();
while (rows.hasNext()) {
XSSFRow row = (XSSFRow) rows.next();
Iterator cells = row.cellIterator();

List data = new ArrayList();
while (cells.hasNext()) {
XSSFCell cell = (XSSFCell) cells.next();
System.out.println(cell.getStringCellValue());
data.add(cell);
}

}
} catch (IOException e) {
e.printStackTrace();
}

最佳答案

有一点会有所不同,那就是打开文件的时间。如果您有文件,请将其传入!使用 InputStream 需要将所有内容缓冲到内存中,这会占用空间。由于您不需要进行缓冲,所以不需要!

如果您运行的是最新的 POI 每晚构建版,那将非常简单。您的代码变为:

File file = new File(file_path);
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

否则,它非常相似:

File file = new File(file_path);
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

这将为您释放一些内存,这可能就足够了。如果不是,并且您不能增加足够的 Java 堆空间来应对,那么您将不得不停止使用 XSSF UserModel。

除了您一直在使用的当前友好的 UserModel 之外,POI 还支持较低级别的文件处理方式。这种较低级别的方法更难使用,因为您没有需要内存中整个文件的各种助手。但是,当您以流方式处理文件时,它的内存效率要高得多。要开始使用,请参阅 XSSF and SAX (Event API) How-To section在 POI 网站上。尝试一下,并查看各种示例。

关于使用 POI 读取 excel 文件 (xlsx) 时出现 java.lang.outofmemory 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11118703/

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