From 0fdbc396e456b99200a968e076be86ae95b2188c Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 29 May 2016 21:33:47 +0000 Subject: [PATCH] Bug 57838: Also remove comments when removing a row git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1746062 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFSheet.java | 14 ++++++-- .../poi/xssf/usermodel/TestXSSFComment.java | 33 ++++++++++++++---- test-data/spreadsheet/57838.xlsx | Bin 0 -> 9675 bytes 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 test-data/spreadsheet/57838.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 98d7f6c1cf..a328f2ad93 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -409,7 +409,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { /** * Verify that none of the merged regions intersect a multi-cell array formula in this sheet * - * @param region * @throws IllegalStateException if candidate region intersects an existing array formula in this sheet */ private void checkForMergedRegionsIntersectingArrayFormulas() { @@ -1386,8 +1385,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { * Rows between startRow and endRow that haven't been created are not included * in result unless createRowIfMissing is true * - * @param startRow the first row number in this sheet to return - * @param endRow the last row number in this sheet to return + * @param startRowNum the first row number in this sheet to return + * @param endRowNum the last row number in this sheet to return * @param createRowIfMissing * @return All rows between startRow and endRow, inclusive * @throws IllegalArgumentException if startRowNum and endRowNum are not in ascending order @@ -1880,6 +1879,15 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { int idx = _rows.headMap(row.getRowNum()).size(); _rows.remove(row.getRowNum()); worksheet.getSheetData().removeRow(idx); + + // also remove any comment located in that row + if(sheetComments != null) { + for (CellAddress ref : getCellComments().keySet()) { + if (ref.getRow() == idx) { + sheetComments.removeComment(ref); + } + } + } } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java index 717fc4e6bc..dac2095ae6 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFComment.java @@ -18,14 +18,9 @@ package org.apache.poi.xssf.usermodel; import static org.apache.poi.xssf.usermodel.XSSFRelation.NS_SPREADSHEETML; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.ss.usermodel.BaseTestCellComment; @@ -314,4 +309,28 @@ public final class TestXSSFComment extends BaseTestCellComment { wb.close(); } } + + @Test + public void bug57838DeleteRowsWthCommentsBug() throws IOException { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57838.xlsx"); + Sheet sheet=wb.getSheetAt(0); + Comment comment1 = sheet.getCellComment(new CellAddress(2, 1)); + assertNotNull(comment1); + Comment comment2 = sheet.getCellComment(new CellAddress(2, 2)); + assertNotNull(comment2); + Row row=sheet.getRow(2); + assertNotNull(row); + + sheet.removeRow(row); // Remove row from index 2 + + row=sheet.getRow(2); + assertNull(row); // Row is null since we deleted it. + + comment1 = sheet.getCellComment(new CellAddress(2, 1)); + assertNull(comment1); // comment should be null but will fail due to bug + comment2 = sheet.getCellComment(new CellAddress(2, 2)); + assertNull(comment2); // comment should be null but will fail due to bug + + wb.close(); + } } diff --git a/test-data/spreadsheet/57838.xlsx b/test-data/spreadsheet/57838.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..59366d0440cb3006a2c4a66d5b7e6e3feecc9678 GIT binary patch literal 9675 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 literal 0 HcmV?d00001 -- 2.39.5