Apache POI XSSFTable.java:294 arrayindex超出范围

时间:2018-01-16 21:13:06

标签: java apache-poi

我正在尝试通过apache POI编辑xls文件,但在调用workbook.write(fileOutpuStream)时,我收到以下错误:

ERROR [2018-01-16 20:33:50,817] java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.poi.xssf.usermodel.XSSFTable.setCellReferences(XSSFTable.java:294)
at org.apache.poi.xssf.usermodel.XSSFTable.getStartCellReference(XSSFTable.java:266)
at org.apache.poi.xssf.usermodel.XSSFTable.updateHeaders(XSSFTable.java:347)
at org.apache.poi.xssf.usermodel.XSSFTable.writeTo(XSSFTable.java:93)
at org.apache.poi.xssf.usermodel.XSSFTable.commit(XSSFTable.java:104)
at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:414)
at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:419)
at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:419)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:242)

我的代码的一些部分是:

Workbook workbook = new XSSFWorkbook(fileInputStream)
Sheet firstSheet = workbook.getSheetAt(0);
/* iterate through rows and columns, write at the last column (fixed number) */
fileInputSream.close()
FileOutputStream fileOut = new FileOutputStream(localFile);
workbook.write(fileOut);
fileOut.close()

类似的代码早先为我工作,所以我不知道这有什么问题。我真的坚持这个。

修改

我得到jontro指出的部分。 确实只找到了我的工作表的起始参考。

我有一个擅长:

id | name   | result
1  | first  |  
2  | second |

我正在迭代行,并在我的系统中创建用户,如果成功创建,我在结果列中写入true(false)。由于xlsx是通过谷歌电子表格创建的,所以我没有结束行,所以如果我找到空名称,我会突破行迭代器。然后在上面写的注释下面执行我的代码部分。

编辑2:

InputStream is = new FileInputStream(localFile);
try (Workbook workbook = new XSSFWorkbook(is)) {
  Sheet firstSheet = workbook.getSheetAt(0);
  Iterator<Row> iterator = firstSheet.iterator();
  while (iterator.hasNext()) {
    Row row = iterator.next();
    Data data = new Data(row.cellIterator());
    //do something with data
    data.getCell().setCellValue("processed");
  }
  FileOutputStream fileOut = new FileOutputStream(localFile);
  workbook.write(fileOut); //fails here
  fileOut.close();
} catch (Exception e) {//print
}



public class Data {
Data (Iterator<Cell> iterator) {
  Cell cell = iterator.next();
  this.var1 = cell.getStringCellValue();
  cell = iterator.next();
  this.var2 = cell.getStringValue();
  ....
  this.cell = iterator.next(); //this is for saying processed
}

我开始同意Axel的评论,这与谷歌电子表格创建Table对象有关。我有一个类似的代码,其中有一个不同的类数据,这是有效的!我双重验证了一切,没有什么不同。

1 个答案:

答案 0 :(得分:1)

通过查看XSSFTable.java主干中的代码,我们可以看到以下代码

private void setCellReferences() {
    String ref = ctTable.getRef();
    if (ref != null) {
        String[] boundaries = ref.split(":", 2);
        String from = boundaries[0];
        String to = boundaries[1];
        startCellReference = new CellReference(from);
        endCellReference = new CellReference(to);
    }
}

ArrayIndexOutOfBoundsException投放在以下行String to = boundaries[1];

预期单元格引用的格式为A1:B3或类似。由于您没有发布循环,因此很难准确说出导致此错误的原因。检查您是否创建了不完整的单元格范围