我正在尝试通过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对象有关。我有一个类似的代码,其中有一个不同的类数据,这是有效的!我双重验证了一切,没有什么不同。
答案 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
或类似。由于您没有发布循环,因此很难准确说出导致此错误的原因。检查您是否创建了不完整的单元格范围