经常在NPOI群里聊天时发现有人在问NPOI设置单元格背景颜色的问题,而Tony Qu大神的博客里没有相关教程,刚好最近在做项目时研究了一下这一块,在这里总结一下。

在NPOI中默认的颜色类是HSSFColor,如果要使用NPOI中的颜色就必须想办法转化为HSSFColor。分析了一下原代码,HSSFColor内置了几十种颜色,都是用内部类继承HSSFColor这个类来定义的。那么除非去修改源代码,否则是不能以这种方式来使用自定义颜色的。

除了继承的方式外,还有另外一种方式使用HSSFColor。答案就是从调色板中获取颜色。从调色板中获取颜色的主要步骤是:1、将颜色的RGB值添加进调色板HSSFPalette中。2、调用HSSFPalette中FindColor方法获取HSSFColor实例。3、在需要使用颜色的地方使用HSSFColor的GetIndex方法获取index值。以下是实现相关源代码:

int StartColIndex = 0;
int rowIndex = 0;
int colIndex = StartColIndex; HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
ISheet sheet = hssfWorkbook.CreateSheet("Sheet1");
IRow row;
ICell cell;
HSSFPalette palette = hssfWorkbook.GetCustomPalette(); List<Color> colorList = new List<Color>();
Random random = new Random(Guid.NewGuid().GetHashCode());
for (int i = 0; i < random.Next(100, 200); i++)
{
colorList.Add(Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)));
} short FIRST_COLOR_INDEX = (short)0x8;
for (int i = 0; i < colorList.Count; i++)
{
if ((short)(FIRST_COLOR_INDEX + i) > (short)0x40)
{
break;
}
//index的取值范围 0x8 - 0x40
palette.SetColorAtIndex((short)(FIRST_COLOR_INDEX + i), colorList[i].R, colorList[i].G, colorList[i].B);
} for (int i = 0; i < colorList.Count; i++)
{
if (i >= (short)(0x40 - 0x8))
{
break;
}
colIndex = StartColIndex;
row = sheet.CreateRow(rowIndex);
cell = row.CreateCell(colIndex);
ICellStyle colorStyle = hssfWorkbook.CreateCellStyle();
colorStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;
var v1 = palette.FindColor(colorList[i].R, colorList[i].G, colorList[i].B);
if (v1 == null)
{
throw new Exception("Color is not in Palette");
}
colorStyle.FillForegroundColor = v1.GetIndex();
cell.CellStyle = colorStyle;
colIndex++;
rowIndex++;
} string fileName = @"test.xls";
using (FileStream file = new FileStream(fileName, FileMode.Create))
{
hssfWorkbook.Write(file);
file.Close();
}

  

需要注意的是,调色板的取值范围是0x8 - 0x40,即8-64,也就是说只支持56种颜色,56种颜色在项目中也差不多够用了。还有就是所调用的颜色一定要存在于调色板中否则在调用FindColor后会返回null,再调用HSSFColor的GetIndex方法时会报错。

最后发一张完整示例项目生成结果的截图, 各位同学如果感兴趣可以将示例下载下来看一下 :-)

示例下载

NPOI自定义单元格背景颜色的更多相关文章

  1. 【转】NPOI自定义单元格背景颜色

    经常在NPOI群里聊天时发现有人在问NPOI设置单元格背景颜色的问题,而Tony Qu大神的博客里没有相关教程,刚好最近在做项目时研究了一下这一块,在这里总结一下. 在NPOI中默认的颜色类是HSSF ...

  2. NPOI 自定义单元格背景颜色-Excel

    NPOI针对office2003使用HSSFWorkbook,对于offce2007及以上使用XSSFWorkbook:今天我以HSSFWorkbook自定义颜色为例说明,Office2007的未研究 ...

  3. NPOI 自定义单元格背景颜色 XSSFWorkbook - Excel

    x 网上找到了,HSSFWorkbook自定义颜色的例子(讲的还挺细致的),但是XSSFWorkbook确没找到...研究了一下,坑掉了一地... NPOI.XSSF.UserModel.XSSFWo ...

  4. 转载 NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  5. NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  6. <转载>NPOI Excel 单元格背景颜色对照表

    我转载地址:http://www.holdcode.com/web/details/117 NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 ...

  7. Easyui之datagrid实现点击单元格修改单元格背景颜色

    前段时间有个需求中有点击datagrid的单元格实现某种事件,调用datagrid的onclickCell这个方法很容易实现,但是体验不好啊,完全不知道自己刚才点击的是哪个单元格,然后就尝试单击单元格 ...

  8. [Xcode 实际操作]五、使用表格-(5)设置UITableView的单元格背景颜色

    目录:[Swift]Xcode实际操作 本文将演示单元格背景颜色的设置 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加两个协 ...

  9. C#使用NPOI导出excel设置单元格背景颜色

    ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.FillPattern = FillPattern.SolidForegrou ...

随机推荐

  1. Java语法糖设计

    语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这 ...

  2. Java开发者必备十大学习网站

    作为开发者来说,必备的除了对编码的热情还要有自己的一套技巧,另外不可缺少的就是平时学习的网站.以下本人收集的Java开发者必备的网站,这些网站可以提供信息,以及一些很棒的讲座, 还能解答一般问题.面试 ...

  3. sgu 101 Domino 解题报告及测试数据

    101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB 题解: 求多米诺骨牌按照一定方式放置能否使相邻的位置 ...

  4. googleBigTable

    Bigtable是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:通常是分布在数千台普通服务器上的PB级的数据.Google的很多项目使用Bigtable存储数据,包括Web索引.Googl ...

  5. 简单说说spring的事务机制,以及是如何管理的?

    事务管理可以帮助我们保证数据的一致性,对应企业的实际应用很重要. Spring的事务机制包括声明式事务和编程式事务. 编程式事务管理:Spring推荐使用TransactionTemplate,实际开 ...

  6. 分布式存储系统 Ceph

    你了解Ceph吗? Ceph是一种分布式存储系统,它可以将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合到一块儿,形成一个大的资源池(PB级别),然后按需分配给应用使用. 那么你知道Ceph的 ...

  7. Ubuntu14.04+caffe+cuda7.5 环境搭建以及MNIST数据集的训练与测试

    Ubuntu14.04+caffe+cuda 环境搭建以及MNIST数据集的训练与测试 一.ubuntu14.04的安装: ubuntu的安装是一件十分简单的事情,这里给出一个参考教程: http:/ ...

  8. 怎么解决teamviewer检测商业用途无法使用的问题

    https://jingyan.baidu.com/article/d5c4b52be51162da560dc517.html

  9. 使用selenium前学习HTML介绍

    <!-- HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (mark ...

  10. ThinkPHP项目 公共方法存放位置

    ThinkPHP项目公共方法写在   根目录-> app-> common 里面 ThinkPHP模板公共方法卸载   根目录->app->模块名称->common  里 ...