我在使用 NPOI 时遇到的问题 - Sheet Tab Color

(我文笔太烂,就当练手了)

 

NPOI 版本信息:

Binary: 2.1.3.1

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

 

最近想改善某个项目中操作 Excel 文件的性能,于是重新开始研究 NPOI。

 

  • 为什么是“重新”?

以前试用过 NPOI,实现过一些很基础的功能,但因为某些原因,一直用 Microsoft.Office.Interop.Excel。

 

  • 为什么是“研究”?

因为 NPOI 的很多功能都有待实现/改善,帮助文档也不完善。甚至为了实现某些功能,不得不花点时间去翻一翻 NPOI 的源码。

github 上的例子很有用,可以少走很多弯路。

 

 

本期问题:Sheet Tab Color

 

> 接口 NPOI.SS.UserModel.ISheet 中定义了相关属性:

 

short TabColorIndex { get; set; }

> 但是,XSSFSheet (.xlsx 文件中的 Sheet)中还未实现 :

 

public short TabColorIndex
{
    get
    {
        throw new NotImplementedException();
    }
    set
    {
        throw new NotImplementedException();
    }
}

不过,XSSFSheet 中有一个方法可以设置 Tab Color:

 

 

public void SetTabColor(int colorIndex)

但是没有方法获取 Tab Color。

为什么不把 SetTabColor 这个方法放到 TabColorIndex 里?难道这个方法性能还不够格,不适合作为属性?

 

> HSSFSheet (.xls 文件中的 Sheet)实现了属性 TabColorIndex。

看上去一切正常。

 

但是如果 Sheet 是从已有的文件载入的,且 Sheet 的 Tab Color 从未设置过,那就接好 NullReferenceException 吧。

 

因为,Tab Color 的信息存放在 HSSFSheet -> _sheet (NPOI.HSSF.Model.InternalSheet) -> sheetext (NPOI.HSSF.Record.SheetExtRecord) 中。NPOI 在载入 HSSFSheet 时,如果 Tab Color 从未设置过,就不会去创建 sheetext,sheetext 一直是 null。

当然也可以通过反射,先创建一个 SheetExtRecord 实例,赋给 sheetext,再将 sheetext 插入到 _sheet 的 Records 里。

一般插入位置是倒数第2个。最后一个 record 项存的应该是 EOF,表示文件末尾。如果插入到其它位置,可能会导致无法生效,甚至在 Microsoft Office Excel 中打开时发出警告。

 

如果 Sheet 最初是通过 NPOI 创建的(IWorkbook.CreateSheet),那么 NPOI 会自动创建 sheetext,并且保存到文件时会把 sheetext 的信息一并写入,下次载入该 Sheet,sheetext 就不会是 null。

你可能感兴趣的:(C#,.Net,开源软件)