`

我在使用 NPOI 时遇到的问题 - Cell Comment

阅读更多

NPOI 版本信息:

Binary: 2.1.3.1

Source Code: https://github.com/tonyqus/npoi (2015-06-15)

 

本期问题:Cell Comment

1. Comment Count

NPOI 限制了每个 HSSFSheet 最大 Comment 数量:1024。(不知道为什么要这么做)(貌似 POI 中已经修复了这个 bug

这会导致:

1.1 如果添加的 Comment 数超过 1024,会引起 NPOI 内部抛出异常 (ArgumentException)。

a) HSSFComment 有个属性 NoteRecord (_note,NPOI.HSSF.Record.NoteRecord),记录了 Comment 的一些信息。

b) HSSFComment 创建后,其属性 ShapeId (int) 会被赋值。

c) 在这个赋值的过程中又会对 NoteRecord 的属性 ShapeId 赋值 (对1024取余的值):

 

public override int ShapeId
{
    get { return base.ShapeId; }
    set
    {
        //...
        _note.ShapeId = (value % 1024);
    }
}
d) NPOI 内部 (EscherAggregate)用 Dictionary 维护这些 NoteRecord。其中 Key 的值是 NoteRecord 的属性 ShapeId。(这就限定了最大数量:1024)。
e) 当把 NoteRecord 添加到 Dictionary(tailRec)中时,会先判断是否已存在相同的 Key。如果已存在,就往 Dictionary 中添加,这就导致抛出异常。(为什么要这么做啊)
internal void AddTailRecord(NoteRecord note)
{
    if (tailRec.ContainsKey(note.ShapeId))
        tailRec.Add(note.ShapeId, note);
    else
        tailRec[note.ShapeId] = note;
}
1.2 如果从现有文件载入 Sheet,且 Sheet 中 Comment 数量超过1024,会导致在取1024前的 Comment 时取到 null,在1024后的 Comment 时拿到的是1024前的某个 Comment。
a) NPOI 载入 Sheet 时会读取所有 NoteRecord(包括其它 Record),存入List。在创建 NoteRecord 实例时,从文件数据流中读取的 ShapeId 可能会重复,即:两个 NoteRecord 有相同的 ShapeId。而且 ShapeId 都是小于 1024 的非负整数。暂时还不了解原因(难道是对文件数据流的解析有问题?)。
b) 首次获取 Cell Comment 时,准确的说是首次创建 HSSFSheet 的 _patriarch (HSSFPatriarch)时,会将这些 NoteRecord 存入 tailRec。此时可能因为 NoteRecord 的 ShapeId 有重复,导致后面添加的项可能会替换之前的项。
c) 创建 HSSFPatriarch 实例的同时,会创建 HSSFComment 实例(HSSFShapeFactory.CreateShapeTree)。此时会根据相应 Record 的数据,从 tailRec 里找到对应的 NoteRecord,并将其传给 HSSFComment 的构造函数。查找 NoteRecord 时是根据 NoteRecord 的 ShapeId 属性进行判断。所以由上一步可知,可能发生 HSSFComment 与 NoteRecord 错乱的情况。
c) 获取某个 Cell 的 Comment 时,会搜索所有 Comment,根据 Cell 的 Row 和 Column 是否与 Comment 的 Row 和 Column 相等。而 Comment 的 Row 和 Column 的值是从它对应的 NoteRecord 的 Row 和 Column 取的。由上一步可知,可能目标的 Comment 无法与该 Cell 匹配,从而得到 null;或其它 Comment 与该 Cell 匹配成功,得到错位的 Comment。
另:XSSF 中处理 Comment 的机制不同,不存在上述问题。
 
2. Comment Size
NPOI 中要设置 Comment 的大小,暂时只能在创建 Comment 时通过传入的 IClientAnchor 设置其大小。
public interface IDrawing
{
    //...
    IComment CreateCellComment(IClientAnchor anchor);
    //...
}
通过设置 IClientAnchor 的四个属性可以设置 Comment 的大小。
public interface IClientAnchor
{
    //...
    int Col1 { get; set; }
    int Col2 { get; set; }
    int Row1 { get; set; }
    int Row2 { get; set; }
    //...
}
这样设置的 Comment 大小与这四个属性指示的这些单元格的大小相关。如果这些单元格变宽,Comment 的宽度也会相应增加(高度也一样)。无法设置固定大小。
(Microsoft.Office.Interop.Excel 中可以通过 Comment 的 Shape 属性设置固定的大小)
 
分享到:
评论

相关推荐

    .NET Core使用NPOI导出复杂Word-NPOI-Export-Word-master.zip

    首先看了下GItHub中的源码有一个简单Word导出的示例,然后在看了网上有很多关于NPOI导出Word文档的案例,发现一个特点网上的好像都差不多,对于我而言网上的这些案例完全能够实现我的这个功能,但是感觉看了网上这些...

    Npoi生成Excel 97-2003/ (xls)文件

    NPOI 是 POI 项目的 .NET... 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

    NPOI 2.5.1.0_new.zip

    NPOI 2.5.1.0版本,为目前最新版本 亲测可用! NPOI 是 POI 项目的 .NET 版本。POI是一个开源的C#,JAVA读写Excel、WORD等...使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。

    NPOI.rar_-baijiahao_NPOI word_npoi _npoi帮助文档_npoi教程

    NPOI帮助文档(1.2.3版),是一个好用的Word操作控件的使用教程。

    NPOI-2.4-稳定版.rar

    NPOI-2.4-稳定版

    npoi-master-excel操作例程

    What's NPOI This project is the .NET version of POI Java project at http://poi.apache.org/. POI is an open source project which can help you read/write xls, doc, ppt files. It has a wide application. ...

    c# 基于NPOI对excel操作-附件资源

    c# 基于NPOI对excel操作-附件资源

    C#使用npoi操作office案例

    C#使用npoi操作office案例C#使用npoi操作office案例C#使用npoi操作office案例C#使用npoi操作office案例C#使用npoi操作office案例C#使用npoi操作office案例

    NPOI代码使用-C#

    处理Excel表格导出,字符处理,单元格处理,行距处理,让导出来的Excel表格看着舒心,很简单的操作就可以

    使用NPOI库操作WORD模板文件。

    使用NPOI库操作WORD模板文件。 C# 使用NPOI 生成WORD模板文件,只支持DOCX格式。 可以用于自动生成各种格式文档。支持图片,支持签名。 有问题可以联系我

    C#使用NPOI导入Excel的方法详解

    本文实例讲述了C#使用NPOI导入Excel的方法。分享给大家供大家参考,具体如下: NPOI是由国人开发的一个进行excel操作的第三方库。百度百科介绍如下:NPOI 本文主要介绍如何使用NPOI将Excel数据读取。 首先引入程序集...

    NPOI-import-and-export-Excel.rar_C# EXCEL npoi_C# npoi_excel_imp

    利用利用NPOI 简单操作 Excel 通用于 c/s和b/s 架构的程序 (半原创)

    NPOI使用文档

    一些博客园内关于NPOI使用的文章 1.Npoi 使用总结 回顾 反思 - baidixing - 博客园 2.NPOI 菜鸟实践行之根据指定的模板生成Excel 2003格式的文件 (一) 3.杨新华 【原创】WinForm操作EXCEL(第三方插件NPOI) 4....

    Labview读写Excel,使用C#封装NPOI

    Labview使用ActiveX操作Excel效率低下而且复杂,而且PC端必须安装Office... 使用NPOI插件效率高,无需安装Office,操作方便 使用C#封装调用方便,满足简单的读写操作

    NPOI 中文使用开发参考手册.doc

    NPOI 中文使用开发参考手册 NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ...

    WinForm使用NPOI-NET.2.0-导入导出+示例.zip

    主要用于Win7系统或XP系统使用一些单机版WinForm程序 使用NPOI不用刻意的去装office软件导出 可以借鉴一下

    使用NPOI操作制作word

    使用NPOI动态链接库,操作生成word,包括生成段落。添加文字,添加页眉。插入图片,插入柱形图,表格等

    NPOI-CSDN下载

    NPOI VERSION-2.3.0.0 C# 用于Excel数据导出功能开发

    c#/vs使用npoi对excel进行简单的操作

    npoi是poi的.net版本,是一个开源的库,可以我们对execl进行一个简单的使用,在这个文件中,我已经实现了对于npoi简单的使用的一些方法的封装,由于我也是近期才有这个需求,可能代码比较稚嫩,但是对于创建excel,...

Global site tag (gtag.js) - Google Analytics