尝试将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,则_vmlShape
为null
。那么什么是_vmlShape
?它是通常在com.microsoft.schemas.vml.CTShape
的构造函数中设置的XSSFComment
。
public XSSFComment(CommentsTable comments, CTComment comment, CTShape vmlShape)。
那么,为什么null
的Entry
值为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
= null
:map.put(e.getKey(), new XSSFComment(this, e.getValue(), null));
的新构造的。
好吧,这就是为什么_vmlShape
是null
并且XSSFComment.java
代码行220抛出了NPE的原因。
为什么sheet.getCellComment(addr)
可以将addr
和CellAddress
用作相同TreeMap<CellAddress, XSSFComment>
的键?
好吧,因为程序员已经知道VMLDrawing
的必要性,请参见 public XSSFComment getCellComment(CellAddress address)。
关于java - 从CellComment检索ClientAnchor时,POI 3.17 NPE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51560755/