性能 - 循​​环遍历单元格 - 使用C#抑制Excel VSTO中的“存储为文本的数字”警告

时间:2014-07-16 15:04:20

标签: c# excel performance vsto

我使用数据库中的数据填充ListObject,并且在插入数据之前预先格式化来自VarChar(& similar)的TextColumns作为Text。

这很有效,但是一些受影响的单元格现在显示“Number Stored As Text”错误。

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

不幸的是,对于大范围,这是无法接受的缓慢

(n.b。 - 如果你在Excel中手动执行它会很快闪亮)

以下是C#中的代码段(针对特定列):

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应用程序级加载项。

1 个答案:

答案 0 :(得分:0)

只是为了确定 - 您是从数据库转到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

你应该可以将它应用到更大的区域。