[英]using Microsoft.Office.Interop Conditional coloring of the rows and column range in a excel sheet in C#
[英]Excel Interop Coloring Cell Using Range
我需要快速地对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_TYPEMISMATCH))在Microsoft.Office.Interop.Excel.Interior.set_Color(Object value)的System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData&msgData)
我找不到任何其他的解决方法,除非通过循环遍历每个单元格而非常慢。 或者是我做错了。
谢谢你的关注。
如果您的问题不是excel addin,我强烈建议您遵循Akhil RJ的建议。 这不是你在互操作中遇到的最后一个大问题,这项技术只是一个大问题和bug。 如果由于某种原因你不能,我可以告诉你一些关于你的问题:
1)没有办法使用数组做你想做的事。 只有值和公式才有可能。
2)使用excel设置颜色或任何其他操作时,设置Application.ScreenUpdating = false
。 然后它冻结用户输入,事情变得更快。
3)如果许多单元格具有相同的颜色 - 使用Application.Union从相同颜色的分隔单元格中生成一个范围。 但它一次只能合并多达50个细胞是有效的。 如果你采取更多,合并操作需要花费太多时间,而且效果不佳。 之后,只需将一种颜色设置为整个合并范围。 相当有效,在我的情况下快5-10倍。
4)还有另一种方式,困难的方法。 我将自己尝试同样的问题(我有一个插件,所以我不能只是开始使用OpenXML)。 使用interop,您可以将目标范围复制到Windows剪贴板。 在剪贴板中,它以多种格式存储,包括类似OpenXMl的东西。 因此,您可以在剪贴板中对其进行编辑并粘贴,再次使用互操作。 我认为这是最快的方法,但编写此代码一定非常耗时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.