--- src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (revision 543521) +++ src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (working copy) @@ -321,6 +321,7 @@ */ public void setSheetOrder(String sheetname, int pos ) { + sheets.add(pos,sheets.remove(getSheetIndex(sheetname))); workbook.setSheetOrder(sheetname, pos); } --- src/java/org/apache/poi/hssf/model/Workbook.java (revision 543521) +++ src/java/org/apache/poi/hssf/model/Workbook.java (working copy) @@ -738,6 +738,7 @@ SSTRecord sst = null; int sstPos = 0; + boolean wroteBoundSheets = false; for ( int k = 0; k < records.size(); k++ ) { @@ -745,6 +746,7 @@ // Let's skip RECALCID records, as they are only use for optimization if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() ) { + int len = 0; if (record instanceof SSTRecord) { sst = (SSTRecord)record; @@ -754,7 +756,17 @@ { record = sst.createExtSSTRecord(sstPos + offset); } - int len = record.serialize( pos + offset, data ); + if (record instanceof BoundSheetRecord) { + if(!wroteBoundSheets) { + for (int i = 0; i < boundsheets.size(); i++) { + len+= ((BoundSheetRecord)boundsheets.get(i)) + .serialize(pos+offset+len, data); + } + wroteBoundSheets = true; + } + } else { + len = record.serialize( pos + offset, data ); + } ///// DEBUG BEGIN ///// // if (len != record.getRecordSize()) // throw new IllegalStateException("Record size does not match serialized bytes. Serialized size = " + len + " but getRecordSize() returns " + record.getRecordSize());