我正在尝试读取一个大的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(); }
}
答案 0 :(得分:0)
SXSSFWorkbook用于流式写入,而不是读取。您是否尝试使用XSSFWorkbook?这仍然需要相当多的内存,所以仍然可以使用1024m的OOM,具体取决于工作簿的大小。
另一种方法是流式阅读方法,参见例如https://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api有关此方法的一些描述。但是,将会有一些不受支持的功能,因此它可能适用于您的用例,也可能不适用。