Excel Open Xml中CellStyleXfs,cellStyle,cellXfs之间关系的总结
最近这几个东东打交道了几天,总算是弄明白了,综合多个帖子,现在总结如下:
在创建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
Excel Open Xml中CellStyleXfs,cellStyle,cellXfs之间关系的总结的更多相关文章
- Android中sp和px之间关系探究
记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本 ...
- maven中 pom.xml与properties等配置文件之间互相读取变量
问题由来: 最近公司的maven项目需要改进,希望把该项目依赖的一系列artifact放到properties文件中,这样做的目的是是为了很容易看到四月份release和七月份的release,它们所 ...
- java:struts2.3框架1(struts2快速配置,各文件之间的关系,基础代码简化版,XML中的通配符)
1.struts2快速配置: A.到http://struts.apache.org下载struts2开发包struts-2.3.32-all.zip B.新建web项目并添加struts2依赖的ja ...
- 在db2中 两个数据库之间的两个表的联合查询
大家好,今天遇到了在db2中 两个数据库之间的两个表的联合查询 我知道oracle中有dblink,可是不知到db2的两个数据库联合查询怎么处理我找了类似于比如两个数据库: db1,db2用户名密码s ...
- testlink用例转换小工具(excel转为xml,python版)
前面文章记录了testlink的安装方法(CentOS 7下安装xampp和testlink),由于testlink仅支持xml格式的用例导入,研究了下excel转xml的方法, 从网上其他网友那里借 ...
- Android XML中引用自定义内部类view的四个why
今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...
- DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)
/// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- android 最详细的动画大全,包括如何在代码和在XML中使用
一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画 ...
随机推荐
- Linux中使用pwconv实现passwd中密码到shadow
1.功能说明:开启用户的投影密码. 2.语 法:pwconv 3.个人理解:就是将/etc/passwd里的密码用x代替,并将真实密码(当然是加密后的)转移到/etc/shadow里面. 4.补充说明 ...
- MySQL事物系列:2:事物的实现
1:事物的隔离性由锁来实现.事物的持久性和事物的原子性通过redo log来实现.事物的一致性通过undo log来实现. redo log恢复提交事物修改的页操作 undo log回滚到行记录某个特 ...
- js 内置函数 内置对象
1.内置函数 Object Array Boolean Number String Function Date RegExp Error 2.内置对象 Date JSON
- BFC特性 形成BFC
1.示例代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- cocos2d-js 小游戏 hungry-hero (原版是flash starling)
[本文被整理到cocos2d-js官方介绍中:http://cn.cocos2d-x.org/tutorial/show?id=1435] 之前看starling资料的时候,发现印度一高人的hungr ...
- 8、java5线程池之动态缓存线程池newCachedThreadPool
JDK文档描述 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能.调用 execute 将重用以前构造的线程 ...
- NotesDocument 作为函数返回值的问题
如下代码 Set recipientDoc = getDocInNAB(“search string”) If Not recipientDoc Is Nothing Then ‘In debug I ...
- CSS中常见的长度单位
原文地址:https://segmentfault.com/a/1190000008934791?utm_source=tuicool&utm_medium=referral px - 像素 ...
- Docker安装和常用命令
Docker安装 Docker的安装可以参考 https://docs.docker.com/ 下面的 Get Docker / Docker CE / Linux, 需要关注的主要是CentOS和U ...
- 1万字!彻底看懂微信小程序
Q:为什么说小程序如炮友? A:小程序刚发布不久就流行一个段子:APP如原配,一年不用几次:服务号如情人,一个月固定几次:订阅号如酒店小卡片,天天可以卖广告:小程序像炮友,用完就走. 资本如嫖客,各个 ...