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

标签 java excel 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 就释放内存)

我确实浏览了 Workbook 的文档, XSSFWorkbook据我了解,没有任何方法可以帮助我获取具有低内存印记的工作表名称。

我找到的一个解决方案是手动解压缩 .xlsx 文件并读取 .\xl\woorkbook.xml 的内容以获取工作表名称和 r:id

是否有 API 可以在不占用大量内存的情况下获取 .xlsx 文件中的工作表名称?

最佳答案

为了显示@Gagravarr 的评论可能意味着什么:

XSSFReader包含一个方法XSSFReader.getSheetsData其中“返回一个迭代器,它可以让您依次获取所有不同的工作表。每个工作表的输入流仅在从迭代器中获取时才会打开。完成每个工作表后,您可以关闭输入流。”。但通常情况下,这并不是全部事实。事实上,它返回 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/55917944/

相关文章:

vba - 评估 Excel VBA bool 条件(不是公式)

windows - 如何从 perl 程序打开 Excel(程序,而不是文件)?

java - 如何在特定栏上书写?

java - 将 Apache POI 添加到 Eclipse

java - 更改 AutoCompleteTextView 的值

java - Gson 不构造内部对象

java - 尝试在 JSF 中执行 "include"时出现问题

java - Camel Route 到 XMPP 聊天室惨败

excel - 如何删除excel中大量命令按钮

java - 如何确定空行?