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组件。假设大家有更好的办法欢迎留言。

转载于:https://www.cnblogs.com/mfrbuaa/p/5078821.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值