4

有一些关于使用 Excel 互操作将数据数组直接分配给范围值的最快方法的文章。像:

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# 中填充“字符”对象数组并将该数组一次性传递给一个范围?还有其他解决方案吗?

4

3 回答 3

5

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

以下是一些无需安装 Excel 即可完成所需工作的开源但更快的方法:

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

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

于 2012-07-01T03:09:36.963 回答
2

我不确定您是否会通过此代码大幅提高性能(因为侵入单个单元格是一项耗时的操作)。Characters 显然是一个范围属性,因此您不必指定特定的单元格。

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

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

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

于 2012-07-01T02:34:47.793 回答
2

在为 Excel 编写不同的库苦苦挣扎了几个月之后,我必须说我终于回到了 Excel Interop,信不信由你。

我尝试了 ClosedXML、EPPlus 和 SpreadsheetLite,但很麻烦地学习了每个库并调整了我的代码。经过漫长的周转、错误、有时会生成无法打开的 Excel、有时会出现可怕的性能问题或内存不足崩溃,我决定再次尝试使用 Excel Interop,并惊讶地发现它更快并且我的场景没有错误。

如果您想尝试 mjb 答案中的库,请执行此操作,但我建议您首先尽可能地编写您的 Interop 代码,如果您做得对,它最终的速度可能会让您感到惊讶。

我的情况的最佳选择是:

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

于 2013-05-09T17:53:16.767 回答