Excel Interop:改变大量单元格中文本部分颜色的最快方法

时间:2012-06-30 04:18:48

标签: c# excel interop

有些文章介绍了使用Excel interop直接将数据数组分配给范围值的最快方式。像:

string[,] multidimensionalArrayData = new string[200, 3];
    // (...) Fill multidimensionalArrayData with your data
dataSheet.Range["A1:C200"].Value = multidimensionalArrayData;

还有一些关于如何更改文本特定部分的字体颜色的文章,例如(这次是VB):

With ActiveCell.Characters(Start:=3, Length:=3).Font
    .Name = "Arial"
    .FontStyle = "Regular"
    .Size = 10
    .Color = "Red"
    .ThemeFont = xlThemeFontNone
End With

现在的问题是,改变数千个单元格的特定文本部分颜色的最快方法是什么?目前,在我的C#代码中,我必须逐个单元地进行,性能受到惊吓。有没有办法在C#中填充'Characters'对象数组并将该数组一次性传递给一个范围?还有其他解决方案吗?

3 个答案:

答案 0 :(得分:5)

使用Excel Interop的操作总是更慢,更多的内存消耗,不推荐使用。

下面是一些开源,但更快的方式来做你需要的,而不需要安装Excel:

http://closedxml.codeplex.com/
http://epplus.codeplex.com/
http://code.google.com/p/excellibrary/
http://npoi.codeplex.com

由Microsoft发布: Open XML 2.0
另一种更快捷的方式来做你想做的事。
下载:http://www.microsoft.com/en-us/download/details.aspx?id=5124
简介:http://blog.stuartwhiteford.com/?p=49

答案 1 :(得分:2)

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

您可以使用以下内容来避免循环

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

很棒的问题....我有很多用于格式化部分单元格的用例,但手动操作很痛苦。

答案 2 :(得分:2)

经过几个月的不同图书馆的Excel写作努力,我必须说我终于回到了Excel Interop,信不信由你。

我尝试了ClosedXML,EPPlus和SpreadsheetLite,学习了每个库并调整了我的代码。经过长途跋涉,错误,有时会产生一个无法打开的Excel,有时会出现可怕的性能问题或内存崩溃,我决定再次尝试使用Excel Interop,并惊讶地发现它更快我的情景没有错误。

如果你想尝试使用mjb中的库,那就去做吧,但是我建议你尽可能地编写你的Interop代码,如果你做得对,它可能会让你感到惊讶。

我个案的最佳选择是:

使用Excel Interop。使用二维数组一次写入所有Excel数据,然后在第二次传递中格式化需要它的那些单元格的富文本。