【问题标题】:PERFORMANCE - looping over cells - suppress “number stored as text” warning in Excel VSTO with C#性能 - 循​​环单元格 - 使用 C# 在 Excel VSTO 中抑制“数字存储为文本”警告
【发布时间】:2014-09-07 04:26:06
【问题描述】:

我正在使用来自数据库的数据填充 ListObject,并在插入数据之前将来自 VarChar(和类似)的 ListColumns 预先格式化为 Text。

这很好用,但一些受影响的单元格现在显示“数字存储为文本”错误。

答案https://stackoverflow.com/a/21869098/1281429 正确地抑制了错误,但需要遍历所有单元格(因为不可能对范围执行操作)。

不幸的是,对于大范围来说,这慢得令人无法接受。

(n.b. - 如果您在 Excel 中手动操作,速度很快)

这是 C# 中的代码 sn-p(针对特定列):

var columnDataRange = listColumn.DataBodyRange
var cells = columnDataRange.Cells;
for (var i = 1; i < cells.Count; i++)
{
    InteropExcel.Range cell = cells[i, 1];
    if (cell.Count > 1) break;

    if (cell.Errors != null)
    {
        var item = cell.Errors.Item[InteropExcel.XlErrorChecks.xlNumberAsText];
        item.Ignore = true;     
    }   
}

有人知道更快的方法吗?

(或者,更一般地说,一种更快的方法来遍历一个范围内的单元格?)

希望有人能提供帮助 - 谢谢。

编辑:这是 Excel 2010/2013 的 VSTO 应用程序级插件。

【问题讨论】:

  • 这是只能在代码中完成的事情吗?您可以在 Excel 本身中预先执行此操作吗?
  • 嗨@rhughes。并非如此:这是我为最终用户构建的 VSTO 插件的一部分,用于以托管方式从数据库中获取数据。
  • 是的,这很常见。有多种方法可以处理这个问题,包括遍历所有单元格(非常慢!)。我通常使用的只是 whole 范围 1 的倍数。我将数字 1 保存在电子表格的某处,复制、粘贴特殊 -> Operation=Multiply。当然,全部通过代码,你根本不需要使用 Select
  • 嗨@PetLahev。我试图抑制错误,而不是相乘,所以我不太确定你的评论有什么帮助。我误会你了吗?

标签: c# excel performance vsto


【解决方案1】:

只是为了确定 - 您要从数据库导出到 Excel 吗?您是在创建新的、干净的电子表格还是覆盖现有电子表格中的现有数据?

如果您要覆盖现有电子表格中的数据,我会首先清除列并在 Excel 中格式化列(当然是通过编程方式)。进入同一空间的旧数据和新数据可能会导致类型问题。

类似: thisExcel.xlWorksheet.Range[yourrange].Value = "" thisExcel.xlWorksheet.Range[yourrange].NumberFormat = choseyourformat http://msdn.microsoft.com/en-us/library/office/ff196401(v=office.15).aspx

您应该能够将其应用于更大的区域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2019-04-30
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多