c#如何获取excel单元格的RGB颜色

这段时间一直在做office的工作。前2天获取单元格的颜色的问题一直没搞明白。

开始我想用的就是Npoi.主要前一部分的工作都是用Npoi完成的

row.GetCell(j).CellStyle.FillBackgroundColorColor 获取IColor接口。通过IColor的RGB属性获取可是经过大量用例测试这里获取的rgb并不准确只有部分颜色对的上。

如图

后来我甚至问了npoi的创始人也没有给我一个明确的回复。

我自己猜测因为row.GetCell(j).CellStyle.FillBackgroundColor 是short类型npoi是不是只支持他枚举的颜色

后来经过翻阅官网的demo发现npoi可以通过rgb设置颜色

/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

/* ================================================================
 * Author: Tony Qu
 * Author's email: tonyqus (at) gmail.com
 * NPOI HomePage: http://www.codeplex.com/npoi
 * Contributors:
 *
 * ==============================================================*/

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;

namespace CustomColorInXls
{
    class Program
    {
        static void Main(string[] args)
        {
            InitializeWorkbook();

            HSSFPalette palette = workbook.GetCustomPalette();
            palette.SetColorAtIndex(HSSFColor.PINK.index, (byte)255, (byte)1, (byte)222);
           //HSSFColor  palette.GetColor()
            //HSSFColor myColor = palette.AddColor((byte)253, (byte)0, (byte)0);

            ISheet sheet1 = workbook.CreateSheet("Sheet1");
            ICellStyle style1 = workbook.CreateCellStyle();
            style1.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.PINK.index;
            style1.FillPattern = FillPatternType.SOLID_FOREGROUND;
            sheet1.CreateRow(0).CreateCell(0).CellStyle = style1;
            short c = sheet1.GetRow(0).Cells[0].CellStyle.FillForegroundColor;
            short []sh = palette.GetColor(c).GetTriplet();

            WriteToFile();
        }

        static HSSFWorkbook workbook;

        static void WriteToFile()
        {
            //Write the stream data of workbook to the root directory
            FileStream file = new FileStream(@"test.xls", FileMode.Create);
            workbook.Write(file);
            file.Close();
        }

        static void InitializeWorkbook()
        {
            workbook = new HSSFWorkbook();

            ////create a entry of DocumentSummaryInformation
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "NPOI Team";
            workbook.DocumentSummaryInformation = dsi;

            ////create a entry of SummaryInformation
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Subject = "NPOI SDK Example";
            workbook.SummaryInformation = si;
        }
    }
}

而且palettle可以通过public HSSFColor GetColor(short index);方法将short转化为HSSFColor而通过HSSFColor类的public virtual short[] GetTriplet();方法可以获取rgb.

但是这里存在2个问题

1.

palette.SetColorAtIndex(HSSFColor.PINK.index, (byte)255, (byte)1, (byte)222);这里是设置的时候固定的设置。而人工操作能否有这种固定的设置。

2.

支持excel2007的XSSFWorkbook并没有GetCustomPalette方法。而通过反编译器我也没找到能获取Palette的类似的类

后通过官网excel2003和excel2007的demo如下code

2003

2007

npoi to excel2007无法获取单元格rgb的颜色 如果颜色不一样会向npoi支持的short转化

实在没法了。只有祭出com组件了。

代码如下:

Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = null;
Microsoft.Office.Interop.Excel.Worksheet worksheet = null;
//打开文件,n.FullPath是文件路径
workbook = application.Application.Workbooks.Open(copyPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Microsoft.Office.Interop.Excel.Range range = null;// 创建一个空的单元格对象
range = worksheet.get_Range(worksheet.Cells[rowNum + 1, ColumnNum + 1], worksheet.Cells[rowNum + 1, ColumnNum + 1]);
if (range.Value2 != null)
{
    string content = range.Value2.ToString();
}
string color = range.Interior.Color.ToString();
 Common com = new Common();
Color col = com.RGB(int.Parse(color));
return new byte[3] { col.R, col.G, col.B };

RGB方法如下:

 public Color RGB(int color)
        {
            int r = 0xFF & color;
            int g = 0xFF00 & color;
            g >>= 8;
            int b = 0xFF0000 & color;
            b >>= 16;
            return Color.FromArgb(r, g, b);
        }

string color的这个color的范围是整个颜色的范围OK问题解决。可是动用了com组件,如果大家有更好的办法欢迎留言。

时间: 2024-10-19 07:30:03

c#如何获取excel单元格的RGB颜色的相关文章

POI获取excel单元格红色字体,淡蓝色前景色的内容

如果是Microsoft Excel 97-2003 工作表 (.xls) if(31 == cell.getCellStyle().getFillForegroundColor()) //判断单元格前景色为淡蓝色 if(10 == book.getFontAt(cell.getCellStyle().getFontIndex()).getColor()) //判断单元格字体颜色为红色 如果是Microsoft Excel 工作表 (.xlsx) if(0 == cell.getCellStyl

获取指定单元格注释的函数

有人在群里问如何获取Excel单元格的注释,就给他写了下面的代码. 1 Function FuncNote(strCell As Range) 2 Application.Volatile 3 FuncNote = strCell.Comment.Text 4 End Function 原文地址:https://www.cnblogs.com/wisever/p/8994725.html

Java用POI解析excel并获取所有单元格数据

1.导入POI相关jar包 org.apache.poi jar 2.代码示例 public List getAllExcel(File file, String tableName, String fname, String enterpriseId, String reportId, String projectId) throws FileNotFoundException, IOException, ClassNotFoundException, InstantiationExcepti

JAVA实现Excel——Excel单元格设计

Excel底层实现是使用C/C++实现的,而我若使用JAVA语言,首先需要对单元格进行对象化,即用一个Cell类来表示每一个单元格(实际上就是一个数据结构): 在我编程过程中,在设计一个简单的类时,往往需要从其父类.接口.Field.Method等几个方面进行分析,以满足功能.性能.可拓展性的要求. 1)接口分析 Serializable接口,EXCEL单元格需要实现复制功能,或者拖拽功能,就必须进行复制(必须为深复制),所以需实现Serializable接口,通过流的方法进行深复制 Compa

读取写入excel单元格

以下是一些对excel的一些基本操作 1:工程对excel类库的导入,如:c:\program files\Microsoft office\offiece11\excel.exe2:命名控件的引入: using Microsoft.office.Interop.Excel; 3:如果是对一个已经存在的excel文件进行操作则:Application app=new Application();Workbook wbook=app.Workbooks.Open("c:\\temp.xls&quo

C# Excel 单元格编辑

public class ExcelReport    {  //Excel 文件修改要引用COM组件Microsoft Excel 11.0 Object Library  //using Microsoft.Office.Interop.Excel;  /// <summary>        /// 单元格修改        /// </summary>        /// <param name="filePath">excel路径<

Excel单元格内容太多会覆盖遮住下一单元格范围

Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设置不当,就会遇到这样的问题:Excel单元格内容太多会覆盖遮住下一单元格范围. 可以通过如下的方法来解决. 方法/步骤 如下图,B2单元格,仅输入了几个中文,但是,由于列的宽度不够,因此,该单元格的内容会延伸到下一单元格并覆盖了下一单元格的范围.从而影响了下一单元格的输入与修改. 此时,我们需要的方

excel单元格中批量加入固定字符

excel单元格前怎么批量加字母 现在我要在联系人这列,每个姓名前加入衡阳的首字母简写(HY). 3 在同行上面随便找列,我找D列.输入公式:="HY"&A2. 5 输入后,点击回车.出现 “HY黑米哥” 6 单元格的下方不是有一个小方点吗,按着鼠标左键往下拖动直到结束 切记,此时不能直接把做好的复制粘贴过去,因为此时为公式,不是数值.可以用鼠标点击一下,上面显示公式. 方法一:选择性粘贴. 方法二:记事本方法.把处理好的数据复制,粘贴到记事本中. 全选记事本数据,复制.粘贴回

JavaScript提高:004:JS获取Gridview单元格时层级问题

使用javascript获取页面中元素的属性,或者对元素进行操作.这种使用是非常多的.不过对于获取那些在页面中单一的元素,诸如,页面上的某个文本框,下拉列表,按钮等可以直接用ID获取到的这种元素,用法自然简单.这里就不多说了,太简单了.一般比较复杂的是,获取元素中的元素,比如动态生成的那些元素.这里就拿表格中的元素为例吧.知道如何获取表格中的单元格内的元素了,其他的复杂元素也就不在话下了.下面举个简单的例子,获取GridView的单元格元素.平常使用比较多的也就是这种的.行中有个操作按钮,然后对