From: PJ Fanning Date: Mon, 18 Oct 2021 10:48:04 +0000 (+0000) Subject: [bug-59388] Set comment with option isVisible in .xlsx. Thanks to ryoii. This closes... X-Git-Tag: REL_5_2_0~364 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b906b72d29f244a507b08360850fc9676210a87f;p=poi.git [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 --- 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 0000000000..9edba119dc Binary files /dev/null and b/test-data/spreadsheet/59388.xlsx differ