簡體   English   中英

使用 Apache POI 獲取大型 Excel 文件的 Excel 工作表名稱

[英]Get excel sheet names for large excel files using Apache POI

我有以下代碼用於獲取 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;

我對上述代碼的問題是,為大小為 9MB 的文件創建XSSFWorkbook需要大量內存(~700MB)和很長時間(5-6s)。 即使將workBookXlsx設置為null也不會釋放javaw占用的內存(我知道gc可能會或可能不會被調用,JVM 不會僅僅因為我將變量設置為 null 就釋放內存)

根據我的理解,我確實閱讀了WorkbookXSSFWorkbook的文檔,沒有任何方法可以幫助我獲得低內存印記的工作表名稱。

我發現的一種解決方案是手動解壓縮.xlsx文件並讀取.\\xl\\woorkbook.xml以獲取工作表名稱和r:id

是否有用於在沒有大內存印記的.xlsx文件中獲取工作表名稱的 API?

為了說明@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 相反,您必須始終查看源代碼

暫無
暫無

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

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