https://bz.apache.org/bugzilla/show_bug.cgi?id=66598
Bug ID: 66598
Summary: IndexOutOfBoundsException when saving a XSSF document
after overwriting a row multiple times
Product: POI
Version: 5.2.3-FINAL
Hardware: PC
Status: NEW
Severity: normal
Priority: P2
Component: XSSF
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
Hi there,
when upgrading POI-OOXML from an ancient V 3.7 to latest stable 5.2.3, all of a
sudden some code caused an IndexOutOfBoundsException when saving the document.
Although it is getting thrown in XmlBeans, I guess its more at the XSSF side.
Exception in thread "main" java.lang.IndexOutOfBoundsException
at org.apache.xmlbeans.impl.store.Xobj.removeElement(Xobj.java:2099)
at org.apache.xmlbeans.impl.store.Xobj.remove_element(Xobj.java:2130)
at
org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.removeC(CTRowImpl.java:146)
at org.apache.poi.xssf.usermodel.XSSFRow.fixupCTCells(XSSFRow.java:612)
at
org.apache.poi.xssf.usermodel.XSSFRow.onDocumentWrite(XSSFRow.java:582)
at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:3806)
at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:3749)
at
org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:467)
at
org.apache.poi.ooxml.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:472)
at org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:221)
at CreateExcel.writeToFile(CreateExcel.java:61)
at CreateExcel.create(CreateExcel.java:23)
at CreateExcel.main(CreateExcel.java:77)
The problem was that in some function the first row of a sheet was overwritten
1x by mistake but the header cells have been set multiple times in a loop.
Admitedly this is probably not a common use case, but maybe there could be
checked something and a meaninful error could be thrown. Finding the main cause
took us some hours because the Exception didn't ring anything :)
below I pasted a small POC which triggers the Exception when the first row is
clobbered twice (second run of the function).
Best
Martin
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
public class CreateExcel {
private final String o_filename;
public CreateExcel(String p_filename) {
o_filename = p_filename;
}
public void create() {
Workbook wb = new XSSFWorkbook();
fillData(wb, 1);
writeToFile(wb);
System.out.println("First file is ok");
wb = new XSSFWorkbook();
fillData(wb, 0);
writeToFile(wb);
}
private void fillData(Workbook p_wb, int startAtRow) {
Sheet sheet = p_wb.createSheet("sheet123");
Row header =sheet.createRow(0);
boolean headerSet =false;
for (int rownum =startAtRow; rownum< 4; rownum++) {
// if (!headerSet) {
fillRow(header,true);
headerSet =true;
// }
Row row =sheet.createRow(rownum);
fillRow(row, false);
}
}
public void fillRow(Row row, boolean header) {
String text =header ? "header " : "cell";
for (int i =0; i < 10; i++) {
Cell cell =row.createCell(i);
cell.setCellValue(text +i);
}
}
private void writeToFile(Workbook p_wb) {
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(o_filename);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
p_wb.write(fileOut);
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fileOut != null) {
fileOut.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CreateExcel createExcel = new CreateExcel("e://wobo.xlsx");
createExcel.create();
}
}
--
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]