C# Interop 从给定范围获取 Excel 单元格背景

C# Interop get Excel cells background from given range

如何从指定范围的单元格中获取背景颜色列表?

这是我找到的唯一解决方案,但它returns来自单个单元格的背景颜色

int colorNumber = System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).Interior.Color);
Color color = System.Drawing.ColorTranslator.FromOle(colorNumber);

我需要这样的东西:

int colorNumber = System.Convert.ToInt32(((Range) worksheet.Range[wsEvars.Cells[rowNumberFrom, columnNumberFrom], wsEvars.Cells[rowNumberTo, columnNumberTo]]).Interior.Color);
Color color = System.Drawing.ColorTranslator.FromOle(colorNumber);

// After execution colorNumber == 0

有没有其他方法可以做到这一点而不必遍历每一行来获取颜色?

您可以获得整个范围 XML 并使用 XDocument 对其进行解析以节省大量互操作调用。它只循环每个单独的样式(=单元格范围的格式):

using NetOffice.ExcelApi.Enums;
using System;
using System.Linq;
using System.Xml.Linq;
using System.Drawing;
using Excel = NetOffice.ExcelApi;

namespace S_43139465
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var app = Excel.Application.GetActiveInstance())
            {
                var range = (Excel.Range)app.Selection;
                var xml = (string)range.get_Value(rangeValueDataType: XlRangeValueDataType.xlRangeValueXMLSpreadsheet);

                var colors = XDocument.Parse(xml)
                                      .Descendants().First(n => n.Name.LocalName == "Styles")
                                      .Descendants().Where(n => n.Name.LocalName == "Interior")
                                      .Select(i => i.Attributes().FirstOrDefault(a => a.Name.LocalName == "Color"))
                                      .Where(a => a != null)
                                      .Select(a => a.Value)
                                      .Distinct()
                                      .Select(s => ColorTranslator.FromHtml(s));

                foreach (var color in colors)
                {
                    Console.WriteLine(color);
                }
            }

            Console.ReadLine();
        }
    }
}