天天看點

我在使用 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 時遇到的問題 - 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。

繼續閱讀