c# - 以编程方式将 Excel 电子表格中的数字字符串转换为实际数字

标签 c# export-to-excel excel-2010

我有一些 C# 代码,它以编程方式循环电子表格中的所有单元格,并将任何数字字符串值转换为实际数字。 它似乎可以工作,但运行速度相当慢(在 40 列 x 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);
  }

有人知道更有效的方法吗?

最佳答案

尝试缓存行数,而不是在循环内调用 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; 
   } 
});

...

关于c# - 以编程方式将 Excel 电子表格中的数字字符串转换为实际数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284064/

相关文章:

c# - 我如何重构/扩展以下模型

bash - 使用带分隔符的 'ssconvert' 将 CSV 转换为 XLS

jquery - Kendo UI kendoTreeList ExportToExcel : "Uncaught ReferenceError: count is not defined", 与聚合列

excel - 使用索引匹配检查一个单元格中的多个值

xml - 将数据从 excel 导出到 XML 模式在嵌套列表中有嵌套列表

F# Excel Range.Sort 失败或重新排列列

c# - 如何修复 "The ConnectionString property has not been initialized"

c# - 从ajax检索数据时如何填充级联下拉列表?

c# - TextBox.Text 绑定(bind)到 ViewModel 的属性

sql - 将SQL查询数据导出到Excel