转载于:https://blog.csdn.net/qq_31615049/article/details/82228812
坑一:为什么模板中的数据获取不到?
当你企图使用SXSSFWorkbook去加载一个已存在的Excel模板时,首先你应该用XSSFWorkbook去获取它
XSSFWorkbook(java.io.File file) XSSFWorkbook(java.io.InputStream is) XSSFWorkbook(OPCPackage pkg) XSSFWorkbook(java.lang.String path)
以上列举了常用的四种获取XSSFWorkbook的方式。接下来如果你要对这个Excel模板做大量行列操作时,如果用XSSF的create方法势必会导致内存溢出。于是我们要使用SXSSFWorkbook去完成这个操作。
根据我对SXSSFWorkbook的了解,它只会加载一部分数据到内存,其余的数据全部持久化到本次磁盘。
但是当你噼里啪啦对SXSSFWorkbook进行了一顿操作时,你会忽然发现为什么SXSSFSheet.getRow(0) = null???
这是因为这些记录存在于XSSFWorkbook中,你需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。
坑二:SXSSFWorkbook为什么我Create了一万行Row但是却获取不到?
当你对SXSSFWorkbook里的SXSSFSheet增加了1w或许多Row时,这个时候你需要留意一下你SXSSFWorkbook的构造器如何定义的。我们要注意SXSSFWorkbook构造器有一些参数,其中有一个rowAccessWindowSize。我个人的理解是这是一个内存窗口的大小,什么意思呢就是能从Sheet窗口看到多少刚才Create了多少Row,如果你设置rowAccessWindowSize为1000,那么你只能看到1000条新创建的数据,如果你设置为 -1 那么你将会看到全部创建的数据。
坑三:Attempting to write a row[0] in the range [0,0] that is already written to disk是什么鬼?
根据我的经验:这是由于你用XSSFWorkbook获取Excel模板的时候已经存在了行,然后用SXSSFWorkbook在Create这行的时候会报这个错误。例如我自己定义的学生表.xlsx
-
XSSFWorkbook xssfWorkbook =
new XSSFWorkbook(
"J:\\学生表.xlsx");
-
SXSSFWorkbook sxssfWorkbook =
new SXSSFWorkbook(xssfWorkbook,-
1);
-
sxssfWorkbook.getSheetAt(
0).createRow(
0);
注意看当我CreateRow第0行的时候 会报错
所以你应该从索引1开始CreateRow。
坑四:我Write完Excel后对象怎么空了?
先上代码讲解
-
XSSFWorkbook xssfWorkbook =
new XSSFWorkbook(
"J:\\学生表.xlsx");
-
SXSSFWorkbook sxssfWorkbook =
new SXSSFWorkbook(xssfWorkbook,-
1);
-
sxssfWorkbook.getSheetAt(
0);
-
SXSSFSheet sxssfSheet = sxssfWorkbook.getSheetAt(
0);
-
SXSSFRow sxssfRow1 = sxssfSheet.createRow(
1);
-
sxssfRow1.createCell(
0).setCellValue(
"000001");
-
sxssfRow1.createCell(
1).setCellValue(
"ljh");
-
sxssfRow1.createCell(
2).setCellValue(
"18");
-
-
OutputStream op =
new FileOutputStream(
"J:\\学生表New.xlsx");
-
sxssfWorkbook.write(op);
-
op.close();
-
-
System.out.println(sxssfWorkbook.getSheetAt(
0).getRow(
1).getCell(
0));
-
System.out.println(sxssfWorkbook.getSheetAt(
0).getRow(
1).getCell(
1));
-
System.out.println(sxssfWorkbook.getSheetAt(
0).getRow(
1).getCell(
2));
首先我们创建一个SXSSFWorkbook 然后create了一行三列,并且赋值完。之后使用OutputStream输出这个文档。
但是当我后下面在输出日志的时候却爆出了空指针异常!所以如果你希望继续使用该Workbook,请在之后进行Write操作!