diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java index 9ce61fbfb0..bb7b65082b 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java @@ -24,6 +24,7 @@ import java.io.OutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Set; import com.microsoft.schemas.vml.CTShape; import org.apache.poi.ooxml.POIXMLDocumentPart; @@ -286,6 +287,29 @@ public class CommentsTable extends POIXMLDocumentPart implements Comments { return false; } + /** + * Remove the comment at cellRef location, if one exists + * + * @param rowNums the rows for which all comments will be removed + * @since POI 5.2.0 + */ + public void removeCommentsFromRows(XSSFSheet sheet, Set rowNums) { + CTCommentList lst = getCTComments().getCommentList(); + XSSFVMLDrawing vml = sheet.getVMLDrawing(false); + for (CTComment comment : lst.getCommentArray()) { + String strRef = comment.getRef(); + CellAddress ref = new CellAddress(strRef); + + // is this comment part of the current row? + if(rowNums.contains(ref.getRow())) { + removeComment(ref); + if (vml != null) { + vml.removeCommentShape(ref.getRow(), ref.getColumn()); + } + } + } + } + /** * Returns the underlying CTComments list xmlbean * diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index e96a5e0933..d9b4331885 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -3052,17 +3052,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { // also remove any comments associated with this row if (sheetComments != null) { - CTCommentList lst = sheetComments.getCTComments().getCommentList(); - for (CTComment comment : lst.getCommentArray()) { - String strRef = comment.getRef(); - CellAddress ref = new CellAddress(strRef); - - // is this comment part of the current row? - if(rowsToRemoveSet.contains(ref.getRow())) { - sheetComments.removeComment(ref); - vml.removeCommentShape(ref.getRow(), ref.getColumn()); - } - } + sheetComments.removeCommentsFromRows(this, rowsToRemoveSet); } // also remove any hyperlinks associated with this row diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java index 640534354a..e09504c725 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFVMLDrawing.java @@ -314,7 +314,11 @@ public final class XSSFVMLDrawing extends POIXMLDocumentPart { return (crow == row && ccol == col); } - protected boolean removeCommentShape(int row, int col){ + /** + * Internal use only + */ + @Internal + public boolean removeCommentShape(int row, int col){ XmlCursor cur = root.getXml().newCursor(); for (boolean found = cur.toFirstChild(); found; found = cur.toNextSibling()) { XmlObject itm = cur.getObject();