C# Excel互操作:在大量单元格中更改文本部分颜色的最快方法

C# Excel互操作:在大量单元格中更改文本部分颜色的最快方法,c#,excel,interop,C#,Excel,Interop,有一些文章介绍了使用Excel interop将数据数组直接指定给范围值的最快数据写入方法。比如: string[,] multidimensionalArrayData = new string[200, 3]; // (...) Fill multidimensionalArrayData with your data dataSheet.Range["A1:C200"].Value = multidimensionalArrayData; 还有一些文章介绍如何更改文本特定部分的字

有一些文章介绍了使用Excel interop将数据数组直接指定给范围值的最快数据写入方法。比如:

string[,] multidimensionalArrayData = new string[200, 3];
    // (...) Fill multidimensionalArrayData with your data
dataSheet.Range["A1:C200"].Value = multidimensionalArrayData;
还有一些文章介绍如何更改文本特定部分的字体颜色,例如(这次是VB):


现在的问题是,对于数千个单元格,改变文本特定部分颜色的最快方法是什么?目前,在我的C#代码中,我必须一个单元一个单元地完成这项工作,性能受到了可怕的影响。有没有办法在C#中填充一个“Characters”对象数组,并一次性将该数组传递到某个范围?还有其他解决方案吗?

我不确定您是否能通过这段代码获得较大的性能提升(因为侵入单个单元是一项耗时的操作)。字符显然是一个范围属性,因此不必指定特定的单元格

您可以使用以下方法来避免循环

With Range("A1:A3").Characters(1, 2).Font
    .Name = "Arial"
    .Size = 6
End With

好问题。。。。我有很多格式化部分单元格的用例,但手工操作很麻烦。

使用Excel Interop的操作总是比较慢,占用更多内存,不推荐使用

以下是一些开源的、更快捷的方法,无需安装Excel即可满足您的需要:






微软发布:开放式XML 2.0
另一种更快的方式来做你想做的事
下载:

简介:

在为编写Excel而与不同的库进行了几个月的斗争之后,我必须说我终于回到了Excel Interop,信不信由你

我尝试了ClosedXML、EPPlus和SpreadsheetLite,学习每个库和修改代码都很麻烦。在经历了一段漫长的周转、bug、有时生成无法打开的Excel、有时出现可怕的性能问题或内存不足的崩溃之后,我决定再次尝试使用Excel Interop,并惊讶地发现它速度更快,而且在我的场景中没有错误

如果您想尝试mjb answer中的库,那么就这样做吧,但我建议您首先尽可能地编写互操作代码,如果您做得正确,那么最终的速度可能会让您感到惊讶

我的案例的最佳选择是:


使用Excel互操作。使用二维数组一次写入所有Excel数据,然后在第二遍中格式化需要的单元格的富文本。

我担心在Excel中更改数千个单元格的特定文本部分的颜色,您将不得不循环遍历每个单元格…悲伤的熊猫脸。。。是否有可能以某种方式处理互操作,以允许我立即发送已按需要着色的全部单元格?是否要对所有单元格应用相同的格式,或者可能不同?例如,对于
A1:A10
,单元格可以有不同的
开始:=
和不同的
长度:=
Excel来自哪里?是否可以退一步说,格式化HTML或XML以供输入?你可以用HTML做很多Excel喜欢的事情。@Siddharth:是的,每个单元格都有不同的文本部分。哇,我不知道有这么多选项和功能。我想用interop做一些高级的事情,但我不确定这些东西是否能够处理,我一定要看看所有这些东西。但我也可以先用这些编写Excel,然后对未涉及的内容使用互操作。谢谢!:)嘿,Pynner,在所有单元格都有相同的文本或着色位置的情况下,这肯定会起作用。不幸的是,在我的例子中,几乎所有的单元格都有不同的文本和颜色部分。无论如何,谢谢!:)请告诉我closeXML和SpreadsheetLite之间哪个更快。我的要求是复制样式和格式的范围。我正在使用生成报告。+!进行评估并返回报告。你真的应该把Pynner的答案标记为正确答案。给自己打勾只是统计填充。@Anonymous类型,我确实回答了Pynner的问题并给了他更高的票数,但答案并不正确,因为它只适用于文本和颜色部分相同的单元格。我发现一个场景,数千个单元格有不同的文本和颜色,更加真实,这也是我的情况。我不寻求统计填充,我相信我正确地遵循了Stackoverflow的规则,如果感觉正好相反,我很抱歉。足够公平了。也许我太轻率了。很抱歉在错误中呼叫您。@ALazyDoe,很遗憾,您无法将不同颜色的数组分配给一个范围。您必须迭代该区域的每个单元格,然后逐个应用颜色。这正是6年前我的表现问题,我不得不这样做。我不知道现在是否发生了变化,但我对此表示怀疑。
With Range("A1:A3").Characters(1, 2).Font
    .Name = "Arial"
    .Size = 6
End With