From 5530f8a8317277f66659aed96510924903cc4ee2 Mon Sep 17 00:00:00 2001 From: Javen O'Neal Date: Wed, 13 Dec 2017 06:21:19 +0000 Subject: [PATCH] bug 57423: add unit test demonstrating corrupted workbook where CTRow xmlbeans are not in ascending order in the CTWorksheet; unit test adapted from Luca git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1817975 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/TestUnfixedBugs.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) 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 ea48e4b16..f9bfcee8f 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; + } + } + }