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

  • 相关阅读:
    c#之字符串,列表,接口,队列,栈,多态
    c#之函数
    KMP算法
    字符串Hash
    洛谷P1807 最长路_NOI导刊2010提高(07)
    洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
    洛谷P2071 座位安排
    二分图最大匹配,匈牙利算法
    差分约束系统
    搜索
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5078821.html
Copyright © 2020-2023  润新知