zoukankan      html  css  js  c++  java
  • 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组件。假设大家有更好的办法欢迎留言。

  • 相关阅读:
    前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上
    HTM5新增结构化元素&非结构化元素&新增属性详解
    HTML 5 与HTML 4 的区别
    HTML5框架、背景和实体、XHTML的使用规范
    百度前端笔试题目--css 实现一个带尖角的正方形
    HTML5表单提交和PHP环境搭建
    HTML5列表、块、布局
    HTML5 格式化、样式、链接、表格
    2020-09-13助教一周总结(第二周)
    2020-09-10上课小结
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5078821.html
Copyright © 2011-2022 走看看