[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
This commit is contained in:
PJ Fanning 2021-10-18 10:48:04 +00:00
parent 87a764956c
commit b906b72d29
3 changed files with 60 additions and 7 deletions

View File

@ -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);
}
}
}
}

View File

@ -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());
}
}
}
}
}

Binary file not shown.