From 16b0c380c94ba518eaf61aa39af70b79a65f7c4b Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 17 Jul 2016 09:27:07 +0000 Subject: [PATCH] Bug 59665: Using HSSFWorkbook#setSheetOrder to move sheets to the end corrupts bspos value in WorkbookRecordList git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1753038 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/hssf/model/InternalWorkbook.java | 5 +++-- .../apache/poi/hssf/usermodel/TestHSSFWorkbook.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/poi/hssf/model/InternalWorkbook.java b/src/java/org/apache/poi/hssf/model/InternalWorkbook.java index 4c0fa6cae9..84c6073c9d 100644 --- a/src/java/org/apache/poi/hssf/model/InternalWorkbook.java +++ b/src/java/org/apache/poi/hssf/model/InternalWorkbook.java @@ -655,17 +655,18 @@ public final class InternalWorkbook { * @param sheetname the name of the sheet to reorder * @param pos the position that we want to insert the sheet into (0 based) */ - 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)); // also adjust order of Records, calculate the position of the Boundsheets via getBspos()... - int pos0 = records.getBspos() - (boundsheets.size() - 1); + int initialBspos = records.getBspos(); + int pos0 = initialBspos - (boundsheets.size() - 1); Record removed = records.get(pos0 + sheetNumber); records.remove(pos0 + sheetNumber); records.add(pos0 + pos, removed); + records.setBspos(initialBspos); } /** diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java index 42771aa8bf..8ddd002f72 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java @@ -1197,4 +1197,17 @@ public final class TestHSSFWorkbook extends BaseTestWorkbook { wb = new HSSFWorkbook(new FileInputStream(file)); assertCloseDoesNotModifyFile(filename, wb); } + + @Test + public void setSheetOrderToEnd() throws Exception { + final HSSFWorkbook workbook = new HSSFWorkbook(); + workbook.createSheet("A"); + try { + for (int i = 0; i < 2 * workbook.getInternalWorkbook().getRecords().size(); i++) { + workbook.setSheetOrder("A", 0); + } + } catch (Exception e) { + throw new Exception("Moving a sheet to the end should not throw an exception, but threw ", e); + } + } } -- 2.39.5