明志唯新

用 NPOI 给 Excel 单元格设置样式也可以用 CSS 啦

发表于

年底了,客户的项目也跟催命似得,其中一个需求是要根据数据分析生成一堆复杂样式的Excel报表。在服务器端生成报表,如果是用 COM 调用 Excel 软件生成 xls 文件是一个很差的想法:

  • 服务器上安装 office,估计服务器维护人员会骂死你
  • ASP.NET 通过 COM 调用 Excel 进行操作,会造成 Excel 进程无法关闭,平白无故浪费资源
  • 正版 Excel 是要购买的哦!

.NET 上有不少第三方库可以生成 Excel,但个人最喜欢 NPOI。这个库其实是从 JAVA 的 POI 项目上搬过来的,API 已经非常成熟。NPOI 国内外的用户都挺多,文档资料也容易找。用 NPOI 生成 xls 文件,非常爽,可以用模板也可以从头开始写,性能和稳定性也都非常好,尤其 2.0 后的版本性能改进很大。但是我们的客户 Excel 样式实在是太花哨了,各种风格几乎不带重样的,同事仅为样式设定就差点在代码中崩溃,于是我决定让他们爽一下,给他们造个利器——可以象写 CSS 一样给单元格 (Cell) 设置各种样式和数据格式,减轻他们的负担提高工作效率,也提升代码可读性。于是经过一整夜的奋斗,打造出了第一个内部试用版,得到同事们的喜好,我很欣慰。

同事使用过程中,我发现了一些小的 bug 和问题,于是再次改进,并考虑兼容 2.0.6,还有提供缩写 csskey。经过几次对字体和样式数量限制的碰底和解决,终于觉得可以公开给大家使用了。至少让喜欢 css 的同学们,可以用相对熟悉和熟练的类似语法设置 excel 单元格样式。

基本用法就是:

1.首先引用 NPOI.CSS 的 dll

2.在代码中引用 NPOI.CSS 命名空间

using NPOI.CSS;

3.对 ICell 对象使用 CSS 扩展方法设置样式

cell.CSS("color:red;font-weight:bold;font-size:11;font-name:宋体;border-type:thin;")

CSS 方法返回的依然是 ICell,所以大家可以用流式写法继续对该对象进行设置,或者常用于设置值。

由于采用了一点特殊手段,解决了一些样式管理的问题,所以目前仅支持 .NET 4 的项目,还在用 .NET 2 或者 3.5 的同学们对不住了 :(

项目源代码目前托管在 GitHub 上,相关细节大家可以移步去看一下 NPOI.CSS ,有任何问题可以在本文下面的评论中留言探讨,谢谢。