From b906b72d29f244a507b08360850fc9676210a87f Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 18 Oct 2021 10:48:04 +0000 Subject: [PATCH] [bug-59388] Set comment with option isVisible in .xlsx. Thanks to ryoii. This closes #239 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1894347 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/XSSFComment.java | 29 +++++++++---- .../poi/xssf/usermodel/TestXSSFComment.java | 38 ++++++++++++++++++ test-data/spreadsheet/59388.xlsx | Bin 0 -> 14534 bytes 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 test-data/spreadsheet/59388.xlsx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFComment.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFComment.java index 441f242f4a..369a8bdc05 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFComment.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFComment.java @@ -26,6 +26,7 @@ import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.model.CommentsTable; +import org.openxmlformats.schemas.officeDocument.x2006.sharedTypes.STTrueFalseBlank; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; @@ -108,8 +109,13 @@ public class XSSFComment implements Comment { public boolean isVisible() { boolean visible = false; if(_vmlShape != null) { - String style = _vmlShape.getStyle(); - visible = style != null && style.contains("visibility:visible"); + if (_vmlShape.sizeOfClientDataArray() > 0) { + CTClientData clientData = _vmlShape.getClientDataArray(0); + visible = clientData != null && clientData.sizeOfVisibleArray() > 0; + } else { + String style = _vmlShape.getStyle(); + visible = style != null && style.contains("visibility:visible"); + } } return visible; } @@ -121,11 +127,20 @@ public class XSSFComment implements Comment { */ @Override public void setVisible(boolean visible) { - if(_vmlShape != null){ - String style; - if(visible) style = "position:absolute;visibility:visible"; - else style = "position:absolute;visibility:hidden"; - _vmlShape.setStyle(style); + if(_vmlShape != null) { + if (visible) { + _vmlShape.setStyle("position:absolute"); + CTClientData clientData = _vmlShape.getClientDataArray(0); + if (clientData != null && clientData.sizeOfVisibleArray() == 0) { + clientData.addVisible(STTrueFalseBlank.X); + } + } else { + _vmlShape.setStyle("position:absolute;visibility:hidden"); + CTClientData clientData = _vmlShape.getClientDataArray(0); + if (clientData != null && clientData.sizeOfVisibleArray() > 0) { + clientData.removeVisible(0); + } + } } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFComment.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFComment.java index e1b57d56e1..caea41f0d2 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFComment.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFComment.java @@ -29,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import com.microsoft.schemas.vml.CTShape; +import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.ss.usermodel.BaseTestCellComment; import org.apache.poi.ss.usermodel.Cell; @@ -311,4 +312,41 @@ public final class TestXSSFComment extends BaseTestCellComment { wb.close(); } + + @Test + void bug59388CommentVisible() throws IOException { + try (UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()) { + try (Workbook wb = XSSFTestDataSamples.openSampleWorkbook("59388.xlsx")) { + Sheet sheet = wb.getSheetAt(0); + Cell a1 = sheet.getRow(0).getCell(0); + Cell d1 = sheet.getRow(0).getCell(3); + + Comment commentA1 = a1.getCellComment(); + Comment commentD1 = d1.getCellComment(); + + // assert original visibility + assertTrue(commentA1.isVisible()); + assertFalse(commentD1.isVisible()); + + commentA1.setVisible(false); + commentD1.setVisible(true); + + // assert after changing + assertFalse(commentA1.isVisible()); + assertTrue(commentD1.isVisible()); + + // check result + wb.write(bos); + + try (Workbook wb2 = new XSSFWorkbook(bos.toInputStream())) { + Sheet sheetWb2 = wb2.getSheetAt(0); + Cell a1Wb2 = sheetWb2.getRow(0).getCell(0); + Cell d1Wb2 = sheetWb2.getRow(0).getCell(3); + + assertFalse(a1Wb2.getCellComment().isVisible()); + assertTrue(d1Wb2.getCellComment().isVisible()); + } + } + } + } } diff --git a/test-data/spreadsheet/59388.xlsx b/test-data/spreadsheet/59388.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9edba119dc6c7924dc963d2e0d9e570b90a50a00 GIT binary patch literal 14534 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 DhmGI; literal 0 HcmV?d00001