簡體   English   中英

創建 XSSFWorkbook 時阻止 Apache POI

[英]Blocking Apache POI While Creating XSSFWorkbook

我在 JDK 1.5 環境中使用 apache POI 3.7 和-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=1000M作為 JVM 參數。

我寫了這樣的代碼來讀取xlsx文件,

File file = new File("C:\\D\\Data Book.xlsx");
InputStream inputStream = new FileInputStream(file);
OPCPackage opcPackage = OPCPackage.open(inputStream);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

在第四行,它進入空閑狀態。 如果我刪除 JVM 參數,它會拋出OutOfMemoryError 我的文件大小是 6MB。

如果使用OPCPackage不是必需的,那么我會直接實例化:

InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx");
Workbook wb = WorkbookFactory.create(inp);

查看POI 快速指南

如果您有文件,則將其傳入。使用 InputStream 需要將所有內容緩沖到內存中,這會占用空間。 由於您不需要進行緩沖,所以不要!

如果您正在運行最新的夜間構建的 POI,那么這很容易。 您的代碼變為:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

否則,它非常相似:

File file = new File("C:\\D\\Data Book.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

很難相信這個問題已經將近 8 年沒有人回答了。 我已經發布了對類似問題之一的相同答案,讓我也將其發布在這里。 嘗試使用非常高效和高性能的流 SXSSFWorkbook 類,而不是 XSSFWorkbook(將整個 Excel 工作簿保存在內存中),如下所示:

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

其中 100 是將保存在內存中並實時處理的默認行數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM