我有一些C#代码,它以编程方式循环遍历电子表格中的所有单元格,并将任何数字字符串值转换为实际数字。 它似乎工作,但运行速度相当慢(在40列乘3000行的电子表格上,运行需要一分钟):
private void SetNumberStringsToValues(Excel.Range range)
{
object[,] values = range.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);
Parallel.For(1, range.Columns.Count, i =>
{
for (var j = 1; j < range.Rows.Count; j++)
{
var doubleValue = 0.0;
if (double.TryParse(values[j, i].ToString(), out doubleValue))
values[j, i] = doubleValue;
}
});
range.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, values);
}
有没有人知道更有效的方法呢?
答案 0 :(得分:4)
尝试缓存行数而不是在循环内调用range.Rows.Count。 range
实例中可能存在一些内部同步,当从多个线程访问时,它们将处于争用状态。
另外,我很好奇为什么你开始枚举1而不是0?不会错过第一行和第一列吗?
...
var columns = range.Columns.Count;
var rows = range.Rows.Count;
Parallel.For(1, columns + 1, i =>
{
for (var j = 1; j <= rows; j++)
{
var doubleValue = 0.0;
if (double.TryParse(values[j, i].ToString(), out doubleValue))
values[j, i] = doubleValue;
}
});
...