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)
我找不到任何其他的解决方法,除非通过循环遍历每个单元格而非常慢.或者是我做错了.
谢谢你的关注.
解决方法
1)没有办法使用数组做你想做的事.只有值和公式才有可能.
2)使用excel设置颜色或任何其他操作时,设置Application.ScreenUpdating = false.然后它冻结用户输入,事情变得更快.
3)如果许多单元格具有相同的颜色 – 使用Application.Union从相同颜色的分隔单元格中生成一个范围.但它一次只能合并多达50个细胞是有效的.如果你采取更多,合并操作需要花费太多时间,而且效果不佳.之后,只需将一种颜色设置为整个合并范围.相当有效,在我的情况下快5-10倍.
4)还有另一种方式,困难的方法.我将自己尝试同样的问题(我有一个插件,所以我不能只是开始使用OpenXML).使用interop,您可以将目标范围复制到Windows剪贴板.在剪贴板中,它以多种格式存储,包括类似OpenXMl的东西.因此,您可以在剪贴板中对其进行编辑并粘贴,再次使用互操作.我认为这是最快的方法,但编写此代码一定非常耗时.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。