0

我正在使用以下 api 从 excel 中读取数据作为表格:https ://jtablesaw.github.io/tablesaw/gettingstarted

代码如下:

XlsxReader reader = new XlsxReader();
        XlsxReadOptions options = XlsxReadOptions.builder("excel/file_example_XLSX_10.xlsx").build();
        try {
            tab = reader.read(options);
            // System.out.println(tab.print());
        } catch (Exception e) {
            e.printStackTrace();
}

文件file_example_XLSX_10.xlsx的大小约为 120 mb,我收到 OutOfMemoryError。

有没有办法让我只读取文件中的特定列。

4

2 回答 2

0

我不熟悉阅读 Excel 文件,但如果您可以将其导出为一个或多个 CSV,则需要注意以下几点:

1)您可以以最小化内存使用的方式读取文件。为方便起见,tablesaw 不使用尽可能小的数字类型。它默认为 int 和 double。您可以指定它尝试使用较少的内存,以便在给定数据适合时使用短或浮点。

    Table t = Table.read()
       .csv(CsvReadOptions.builder("../myfile.csv")
          .minimizeColumnSizes()
    );

这可能也适用于 Excel,因为它在 ReadOptions 中定义,而不是更具体的 CsvReadOptions。

2) 或者,对于 CSV,您可以指定一个 ColumnTypes 数组,其中一个可以是 ColumnType.SKIP。同样,这可以使用 CsvReadOptions 来完成。

至少对于 CSV,150MB 对于典型的桌面应用程序来说并不算大。我昨天读了一个 800MB 的文件,没有问题,也没有触及 IDEA 中的 JVM 内存设置。OTOH,我不在最新版本上,所以 YMMV。

于 2020-06-19T13:38:06.113 回答
0

我认为没有办法只读取某些列,您是否尝试过使用 Apache POI 来读取 excel?还是运行时增加内存?

于 2020-06-18T09:52:25.603 回答