Excel Interop使用范围为单元格着色

本文关键字:单元格 Interop 使用范围 Excel | 更新日期: 2023-09-27 18:27:02

我需要快速为Excel单元格上色。我发现了类似的方法来写入Excel单元格,这对我来说真的很快,所以我尝试在给单元格着色时应用同样的方法。考虑以下代码:

xlRange = xlWorksheet.Range["A6", "AS" + dtSchedule.Rows.Count];
double[,] colorData = new double[dtSchedule.Rows.Count, dtSchedule.Columns.Count];
for (var row = 0; row < dtSchedule.Rows.Count; row++)
{
    for (var column = 0; column < dtSchedule.Columns.Count; column++)
    { 
        if (column <= 3)
        { 
            colorData[row, column] = GetLightColor2("#ffffff"); 
            continue;
        }

        if (dtSchedule.Rows[row][column].ToString() != "#000000" && !string.IsNullOrEmpty(dtSchedule.Rows[row][column].ToString()))
        {
            string[] schedule = dtSchedule.Rows[row][column].ToString().Split('/');
            string color = schedule[0].Trim();
            colorData[row, column] = GetLightColor2(color); 
            continue;
        }
        colorData[row, column] = GetLightColor2("#000000"); 
    }
}
xlRange.Interior.Color = colorData;

这是GetLightColor2函数:

private double GetLightColor2(string hex)
{
    return ColorTranslator.ToOle(ColorTranslator.FromHtml(hex));
} 

当我运行代码时,出现了一个错误

xlRange.Interior.Color = colorData;

出现以下错误:

System.Runtime.InteropServices.COMException(0x80020005):类型不匹配。(HRESULT出现异常:0x80020005(DISP_E_TYPEMIMACH))在System.RuntimeType.ForwardCallToInvokeMember(String-memberName,BindingFlags标志,对象目标,Int32[]aWrapperTypes,MessageData&msgData)在Microsoft.Office.Interop.Excel.Interior.set_Color(对象值)

我找不到任何其他解决方法,除非通过循环遍历每个单元格来着色,这真的很慢。或者是我做这件事的方式不对。

谢谢你们的关心。

Excel Interop使用范围为单元格着色

如果你的问题不是关于excel addin,我强烈建议你听从Akhil R J的建议。这不是interop中遇到的最后一个大问题,这项技术只是一个大的问题和bug。如果由于某种原因你不能,我可以告诉你一些关于你的问题:

1) 使用数组无法执行您想要的操作。它只能用于值和公式。

2) 当您使用excel设置颜色或任何其他操作时,请设置Application.ScreenUpdating = false。然后它冻结了用户输入,事情进展得更快。

3) 如果多个单元格具有相同的颜色,请使用Application.Union从相同颜色的分隔单元格中创建一个区域。但它只能在一次内合并多达50个细胞。若花费更多,合并操作将花费太多时间,而且效果不佳。之后,只需为整个合并范围设置一种颜色。相当有效,在我的情况下大约快5-10倍。

4) 还有另一种方法,很难。对于同样的问题,我将自己尝试(我有一个插件,所以我不能只是开始使用OpenXML)。使用互操作,可以将目标范围复制到windows剪贴板。在剪贴板中,它以多种格式存储,包括类似OpenXMl的格式。因此,您可以在剪贴板中编辑它并粘贴回,再次使用互操作。我认为这是最快的方法,但写这段代码肯定非常耗时。