diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java index ea48e4b169..f9bfcee8f0 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java @@ -342,4 +342,42 @@ public final class TestUnfixedBugs { assertEquals("Did not have expected contents at rownum " + rowNum, contents + ".0", cell.toString()); } + + @Test + public void bug57423_shiftRowsByLargeOffset() throws IOException { + try ( + XSSFWorkbook wb = new XSSFWorkbook(); + //OutputStream out = new FileOutputStream("/tmp/57423." + wb.getClass().getName() + ".xlsx")); + ) { + Sheet sh = wb.createSheet(); + sh.createRow(0).createCell(0).setCellValue("a"); + sh.createRow(1).createCell(0).setCellValue("b"); + sh.createRow(2).createCell(0).setCellValue("c"); + sh.shiftRows(0, 1, 3); + + XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb); + + assertThatRowsInAscendingOrder(wb); + assertThatRowsInAscendingOrder(wbBack); + + //wbBack.write(out); + // Excel reports that the workbook is corrupt because the rows are not in ascending order + // LibreOffice doesn't complain when rows are not in ascending order + + wbBack.close(); + } + } + + private void assertThatRowsInAscendingOrder(final XSSFWorkbook wb) { + // Check that CTRows are stored in ascending order of row index + long maxSeenRowNum = 0; //1-based + for (final CTRow ctRow : wb.getSheetAt(0).getCTWorksheet().getSheetData().getRowArray()) { + final long rowNum = ctRow.getR(); //1-based + //final int rowNum = Integer.parseInt(ctRow.getR()); //1-based + assertTrue("Row " + rowNum + " (1-based) is not in ascending order; previously saw " + maxSeenRowNum, + rowNum > maxSeenRowNum); + maxSeenRowNum = rowNum; + } + } + }