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):types不匹配。 (对象值)在System.RuntimeType.ForwardCallToInvokeMember(stringmemberName,BindingFlags标志,对象目标,Int32 [] aWrapperTypes,MessageData和msgData)上的HRESULT(exception从0x80020005(DISP_E_TYPEMISMATCH)

我无法find任何其他的解决方法,除非通过循环通过每个单元格非常慢的单元格着色。 或者是我做错了。

谢谢你们的关注。

如果你的问题不是关于excel插件,我强烈build议遵循Akhil RJ的build议。 这不是在interop中遇到的最后一个大问题,这个技术只是一个大问题和bug。 如果由于某种原因,你不能,我可以告诉你一些关于你的问题的事情:

1)没有办法做你想用数组。 只有值和公式才有可能。

2)设置Application.ScreenUpdating = false ,当你设置颜色或任何其他操作与Excel。 然后冻结用户input,事情变得更快。

3)如果许多单元格具有相同的颜色 – 使用Application.Union从相同颜色的单元格中划分出一个范围。 但是一次只合并多达50个单元是有效的。 如果你采取更多,合并操作需要太多的时间,而且不是有效的。 之后,只需在整个合并范围内设置一种颜色。 相当有效,在我的情况下快5-10倍。

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