今天记录一个问题,就是用SXSSFWorkbook读取文件之后,不能在原有的sheet页追加内容的问题。
读取文件:
SXSSFWorkbook wb = new SXSSFWorkbook(new XSSFWorkbook(new FileInputStream(new File("D:\\temp\\export.xlsx"))), 100);
获取第一页sheet:
Sheet sheetAt = wb.getSheetAt(0);
本来想着在第一页继续追加数据的,但是debug发现sheetAt的数据size = 0,拿不到。(后来发现是因为数据都保存在硬盘)
最后发现好像只能创建一个新的Sheet来保存数据。 Sheet sh = wb.createSheet();
然后在继续追加数据就行了。
今天,发现可以通过:XSSFSheet sh = wb.getXSSFWorkbook().getSheetAt(0);这样的方式拿到指定的sheet页,sh.getLastRowNum()也能拿到数据,之后就继续追加。但是后面不能把数据刷到磁盘上面了,((SXSSFSheet) sh).flushRows(maxBuff)报错,因为XSSFSheet 不能转换。
注意:new SXSSFWorkbook(new XSSFWorkbook(new FileInputStream(new File("D:\\temp\\export.xlsx"))), 100); 这玩意很坑,因为必须通过XSSFWorkbook来读取文件,所以导致每次读的时候数据都写在内存里面,就可能会导致OOM。
本来原来想法是封装一个工具类,之后,用的时候调用。这样分批插入的时候就必须判断文件是否存在,不存在就直接new SXSSFWorkbook(100),存在就 new SXSSFWorkbook(new XSSFWorkbook(new FileInputStream(new File("D:\\temp\\export.xlsx"))), 100),然后创建新的sheet来添加数据,但是后面超过25w数据就oom了。
解决方法:1、网上说的可以用easyExcel ;2、不要封装成工具类了,就直接单独处理导出,虽然代码冗余,但是不会出现oom