--- src/java/org/apache/poi/hssf/model/InternalWorkbook.java (revision 1357535) +++ src/java/org/apache/poi/hssf/model/InternalWorkbook.java (working copy) @@ -624,9 +624,16 @@ */ public void setSheetOrder(String sheetname, int pos ) { - int sheetNumber = getSheetIndex(sheetname); - //remove the sheet that needs to be reordered and place it in the spot we want - boundsheets.add(pos, boundsheets.remove(sheetNumber)); + int sheetNumber = getSheetIndex(sheetname); + //remove the sheet that needs to be reordered and place it in the spot we want + boundsheets.add(pos, boundsheets.remove(sheetNumber)); + //reorder records list as well + int baseIndx = records.getBspos() - (boundsheets.size() - 1); + int recIndx = baseIndx + sheetNumber; + int recNewIndx = baseIndx + pos; + Record rec = records.get(recIndx); + records.remove(recIndx); + records.add(recNewIndx, rec); } /** --- src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (revision 1357535) +++ src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (working copy) @@ -2238,4 +2238,26 @@ // make sure we are still readable writeOutAndReadBack(workbook); } + + /** + * Test case for bug #50083. + * If bug is present, test case throws an IllegalArgumentException + * on workbook serialization. + */ + public void test50083() { + HSSFWorkbook workbook = new HSSFWorkbook(); + Sheet sheet0 = workbook.createSheet("Sheet_00"); + + Sheet sheet1 = workbook.createSheet("Sheet_1"); + + //Breaks propper sheet order here. + workbook.setSheetOrder(sheet1.getSheetName(), 0); + + //Deletes wrong sheet record due to the wrong reordering above. + workbook.removeSheetAt(0); + + //Exception gets thrown here because of incorrect data is supplied + //when calculating output buffer size on workbook serialization. + writeOutAndReadBack(workbook); + } }