经常在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方法时会报错。

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

/*修改样式关键代码*/
                        ICellStyle style = workbook.CreateCellStyle();
                        style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;
                        style.FillPattern = FillPattern.SolidForeground;

style.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;

/*修改指定单元格样式 如果要修改行样式则需要将row.Cells.Count循环出来,挨个设置!*/

row.Cells[5].CellStyle = style;

【转】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. sipp中的action使用方法

    最近在做sip服务器的压力测试 场景:当主叫收到200 Ok之后要将Contact 头域中的字段放在ACK消息中的请求行和to头域中发给被叫 查看sipp官网文档就使用action, 在主叫脚本中增加 ...

  2. 百度MUX:APP动效之美需内外兼修

    移动互联网时代已经到来.APP已如天空的繁星.数也数不清.随着手机硬件的不断升级,实现炫酷且流畅的动效不再是遥远的梦想.假设你是APP达人,喜欢试用各种APP,你肯定会发现越来越多的APP開始动效化. ...

  3. iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究

    今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...

  4. map方法,以及filter方法的使用

    map()方法,会返回一个 jQuery 封装的数组, 这个数组不能直接使用,需要使用 get() 来处理返回的对象以得到基础的数组. 例子: <!DOCTYPE html> <ht ...

  5. hibernate 悲观锁乐观锁

    悲观锁和乐观锁是:在事务隔离机制中设置了ReadCommited的情况下,两种可以避免不可重复读的方式.   设置成读已提交是考虑到安全和处理速度,保证并发效率,但是在这个情况下仍然需要避免不可重复读 ...

  6. RecycleView实现多布局可展开列表

    代码地址如下:http://www.demodashi.com/demo/13193.html 前言 在开发的时候,我们不免会遇到这么一种数据展示,该数据有以下特征: 数据要以列表形式展示 每条数据要 ...

  7. OgnlValueStack:49 - Error setting expression 'sfjmyh.zdyx6' with value '[Ljava.lang.String;@28d320d6'

    作过户管理流程时,提交表单后控制台显示如下错误 : WARN com.opensymphony.xwork2.ognl. OgnlValueStack:60 - Error setting expre ...

  8. jQuery.Validate常用的一些规则

    // 手机号码验证 jQuery.validator.addMethod("mobile", function(value, element) { var length = val ...

  9. 对象关系映射 EmitMapper 及Tuple的使用

    public TDestination Map<TSource, TDestination>(TSource tSource) { if (tSource == null) return ...

  10. 【Android】 给我一个Path,还你一个酷炫动画

    本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家公布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53040506 ...