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();
}
}
}
如何从指定范围的单元格中获取背景颜色列表?
这是我找到的唯一解决方案,但它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();
}
}
}