从CellComment检索ClientAnchor时,POI 3.17 NPE

时间:2018-07-27 15:05:23

标签: java apache-poi comments

在尝试将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();

1 个答案:

答案 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}}?

Entrypublic 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 = XSSFCommentCTShape vmlShape

好吧,这就是nullmap.put(e.getKey(), new XSSFComment(this, e.getValue(), null));_vmlShape代码行220抛出NPE的原因。

为什么null可以将XSSFComment.javasheet.getCellComment(addr)用作同一addr的密钥?

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