尝试将CellComment从一个工作表复制到同一工作簿中的另一个工作表时,CellComment ClientAnchor的检索会收到NPE。

java.lang.NullPointerException at org.apache.poi.xssf.usermodel.XSSFComment.getClientAnchor(XSSFComment.java:220)


使用的代码:

for (Entry<CellAddress, ? extends Comment> e : sheet.getCellComments().entrySet())
  {
    CellAddress addr = e.getKey();
    Comment comment = e.getValue();
    ClientAnchor anchor = comment.getClientAnchor();


这是POI还是检索代码的问题?

请注意,以下代码有效并检索ClientAnchor。

  for (CellAddress addr : sheet.getCellComments().keySet())
  {
    Comment comment = sheet.getCellComment(addr);
    ClientAnchor anchor = comment.getClientAnchor();

最佳答案

至少在apache poi版本apache poi中,这绝对是3.17的问题。问题的种类是我不在apache poi的开发人员名单上的原因之一。

以下所有关于apache poi版本3.17

如果XSSFComment.java:220抛出NPE,则_vmlShapenull。那么什么是_vmlShape?它是通常在com.microsoft.schemas.vml.CTShape的构造函数中设置的XSSFComment

public XSSFComment(CommentsTable comments, CTComment comment, CTShape vmlShape)

那么,为什么nullEntry值为XSSFSheet.getCellComments().entrySet()呢?

XSSFSheet中,public Map getCellComments()返回sheetComments.getCellComments()。那么什么是sheetComments?这是在reading the sheet's package part from the worbook时读取的org.apache.poi.xssf.model.CommentsTable

那么什么返回sheetComments.getCellComments()?它返回一个final TreeMap<CellAddress, XSSFComment> map,其中每个值都是一个XSSFComment。但是所有这些XSSFComment都是具有CTShape vmlShape = nullmap.put(e.getKey(), new XSSFComment(this, e.getValue(), null));的新构造的。

好吧,这就是为什么_vmlShapenull并且XSSFComment.java代码行220抛出了NPE的原因。

为什么sheet.getCellComment(addr)可以将addrCellAddress用作相同TreeMap<CellAddress, XSSFComment>的键?

好吧,因为程序员已经知道VMLDrawing的必要性,请参见 public XSSFComment getCellComment(CellAddress address)

关于java - 从CellComment检索ClientAnchor时,POI 3.17 NPE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51560755/

10-10 03:03