在尝试将CellComments从一张工作表复制到同一工作簿中的另一张工作表时,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();
答案 0 :(得分:1)
这绝对是(import ./reflex-platform {}).project ({ pkgs, ... }: {
overrides = self: super: {
heist = pkgs.haskell.lib.doJailbreak super.heist;
map-syntax = pkgs.haskell.lib.doJailbreak super.map-syntax;
};
packages = {
common = ./common;
backend = ./backend;
frontend = ./frontend;
google-maps-reflex = ./google-maps-reflex;
};
shells = {
ghc = ["common" "backend" "frontend" "heist"]; # "backend" "frontend"];
ghcjs = ["common" "frontend"];
};
})
的问题,至少对于apache poi
版本apache poi
而言。而这种问题是我不在3.17
的开发人员名单中的原因之一。
以下所有内容都是关于apache poi
版本apache poi
。
如果XSSFComment.java:220抛出NPE,则3.17
为_vmlShape
。那么null
是什么?它是_vmlShape
,通常是在com.microsoft.schemas.vml.CTShape
的构造函数中设置的。
public XSSFComment(CommentsTable comments, CTComment comment, CTShape vmlShape)。
那么为什么XSSFComment
的值为null
的{{1}}?
在Entry
中public Map getCellComments()返回XSSFSheet.getCellComments().entrySet()
。那么XSSFSheet
是什么?它是reading the sheet's package part from the worbook时读取的sheetComments.getCellComments()
。
那么什么返回sheetComments
?它返回一个final TreeMap<CellAddress, XSSFComment> map
,其中每个值都是一个org.apache.poi.xssf.model.CommentsTable
。但是所有这些sheetComments.getCellComments()
都是新建的,XSSFComment
= XSSFComment
:CTShape vmlShape
。
好吧,这就是null
是map.put(e.getKey(), new XSSFComment(this, e.getValue(), null));
且_vmlShape
代码行220抛出NPE的原因。
为什么null
可以将XSSFComment.java
和sheet.getCellComment(addr)
用作同一addr
的密钥?
好吧,因为那里的程序员已经知道CellAddress
的必要性,请参见 public XSSFComment getCellComment(CellAddress address)。