c# - Excel 互操作着色单元格使用范围

标签 c# excel excel-interop

我需要快速为 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): Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)) at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Interior.set_Color(Object value)

我找不到任何其他解决方法,除非通过循环遍历每个非常慢的单元格来为单元格着色。还是我做错了。

谢谢大家的关注。

最佳答案

如果您的问题不是关于 excel 插件,我强烈建议您遵循 Akhil R J 的建议。这不是您在互操作中遇到的最后一个大问题,这项技术只是一个大问题和错误。如果由于某种原因你不能,我可以告诉你一些关于你的问题的事情:

1) 没有办法用数组做你想做的事。仅适用于值和公式。

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

3) 如果许多单元格具有相同的颜色 - 使用 Application.Union 从相同颜色的分隔单元格中创建一个范围。但一次只能合并最多 50 个单元格才有效。如果拿多了,合并操作就太费时间了,而且效果不好。之后,只需将一种颜色设置为整个合并范围。非常有效,在我的案例中快了大约 5-10 倍。

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

关于c# - Excel 互操作着色单元格使用范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305162/

相关文章:

VBA map 实现

F# Excel Range.AutoFilter() 失败

c# - 使用互操作在后台打开 Excel 工作簿

c# - RemoteCertificateChainErrors - 空 ChainElementStatus C#

c# - 带有 yield 返回的 foreach 循环内的“使用未分配的局部变量”错误

c# - URL 的编码参数

c# - Xamarin 中的 MVVM 绑定(bind)

python - 创建一个基于值 excel 填充的饼图?

C# Excel 范围管理

c# - 具有多个打开的工作簿的自定义任务 Pane