最近這幾個東東打交道了幾天,總算是弄明白了,綜合多個帖子,現在總結如下:
在創建stylesheet時,必須創建fonts,Fills,Borders 和cellXfs(CellFormats)四個節點。
而cellXfs節點是綜合節點,它需要引用numFormatId列表、FontId列表、fillId列表和borderId列表,這些都包含在Styles.xml文件中。
1.cellStyle, 單元格自定義樣式總綱,"name"屬性表示的是CellStyleXfs中樣式的名稱,"xfId"屬性表示的是CellStyleXfs中"xf"子節點的索引,從0開始。
2.CellStyleXfs,單元格自定義樣式詳細定義,里面擁有FontId, fillId, borderId等屬性。
3.cellXfs,是單元格的樣式,里面也擁有FontId, fillId, borderId等屬性, 可以說,他就是CellStyleXfs的克隆,同CellStyleXfs相比,它多了一個xfid屬性,表示它對應CellStyleXfs的第幾項索引,從0開始。
他們之間的具體關系,下面這篇文章寫的很精辟,how to understand the process of cell formatting ? http://social.msdn.microsoft.com/Forums/zh-CN/e6fe3ff0-152e-4398-9d17-fee8476ae466/how-to-understand-the-process-of-cell-formatting-
總結一下:即單元格沒有指定特別的樣式時,也就是打開excel,在單元格中隨意輸入一個字符,然后什么都不做就保存,這就是沒有指定特別的樣式,用excel再次打開該文檔時,它就去cellStyle里找默認的Normal樣式,該樣式在CellStyleXfs里定義,可以找到對應的fontid, fillid, borderid, numfmtid等等。 如果給單元格指定了某種樣式,就去cellXfs里找這種格式,它里面也可以找到對應的fontid, fillid, borderid, numfmtid等等。
實際的Demo如下:
1.打開excel,在單元格中隨意輸入一個字符,然后什么都不做就保存,這就是沒有指定特別的樣式, 此時style.xml中的cellXfs, cellStyleXfs, cellStyles如下:

2.用excel打開這個文件,新建一種單元格樣式:樣式1,但不給任何一個單元格應用,操作步驟如下:


保存該文件,現在styles.xml里的代碼如下:

可以看到,新增的樣式保存在cellStyleXfs和cellStyles節點中了,因為沒有單元格應用它,所以在cellXfs中沒有它的蹤跡。
在sheet1.xml中,如下圖,該單元格沒有s="*"的標記,excel就去cellStyles里去找默認的常規樣式,然后按照xfId="0"再去cellStyleXfs里找第一項,用里面標記的borderid, fillid, fontid, numFmtId去給它應用了。

3.給一個單元格應用:樣式1

此時styles.xml中代碼如下:

這時,cellXfs里就有添加進樣式1的內容了, 同時在sheet1.xml中,應用了此樣式的單元格上有了s="1"的標記,如下圖,索引從0開始,s="1"其實指的第二項,這時excel就直接用cellXfs里第二項,用里面標記的borderid, fillid, fontid, numFmtId去給它應用了。

完
附錄:
1.CellStyle Class Cell Style.When the object is serialized out as xml, its qualified name is x:cellStyle. http://msdn.microsoft.com/zh-cn/library/ie/documentformat.openxml.spreadsheet.cellstyle.aspx?cs-save-lang=1&cs-lang=vb
2.CellStyleFormats Class Formatting Records.When the object is serialized out as xml, its qualified name is x:cellStyleXfs. http://msdn.microsoft.com/zh-cn/library/ie/documentformat.openxml.spreadsheet.cellstyleformats.aspx
3.CellFormats Class Cell Formats.When the object is serialized out as xml, its qualified name is x:cellXfs. http://msdn.microsoft.com/zh-cn/library/ie/documentformat.openxml.spreadsheet.cellformats.aspx
