如何使用apache POI读取大型xlsm文件

时间:2018-02-13 10:22:54

标签: java memory apache-poi heap-memory xlsm

我正在尝试读取一个大的xlsm文件,我正在收集堆空间错误,我正在使用XSSFWorkbook作为大文件,但我仍然得到了这个。而且我还将VM争论者-Xmx1024m设置为eclipse.Here是我的代码

public class TestSJXLSX {
public static void main(String[] args) throws Throwable {

    OPCPackage pkg = OPCPackage.open(new File("D:\\resources\\1712_Reporting.xlsm"));
        XSSFWorkbook wb_template;
        wb_template = new XSSFWorkbook(
            pkg
        );
    System.out.println("package loaded");
    SXSSFWorkbook wb = new SXSSFWorkbook(wb_template);      wb.dispose();
    wb.setCompressTempFiles(true);

    SXSSFSheet sh = (SXSSFSheet) wb.createSheet();
    sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
    for(int rownum = 4; rownum < 5000; rownum++){
       Row row = sh.createRow(rownum);
       for(int cellnum = 0; cellnum < 10; cellnum++){
        Cell cell = row.createCell(cellnum);
        String address = new CellReference(cell).formatAsString();
        cell.setCellValue(address);
       }

    }
    FileOutputStream out = new FileOutputStream(new File("D:\\new_file.xlsm"));
    wb.write(out);
    out.close();  }

}

1 个答案:

答案 0 :(得分:0)

SXSSFWorkbook用于流式写入,而不是读取。您是否尝试使用XSSFWorkbook?这仍然需要相当多的内存,所以仍然可以使用1024m的OOM,具体取决于工作簿的大小。

另一种方法是流式阅读方法,参见例如https://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api有关此方法的一些描述。但是,将会有一些不受支持的功能,因此它可能适用于您的用例,也可能不适用。