2014-04-10 20 views
0

我有代码,手动将数据从两个数据表复制到两个excel工作表,然后对两个数据表中的数据进行比较。excel自动化性能,同时手动应用格式化到许多单元格和行

我已经将数据插入excel的性能好得多,但我认为我有一个瓶颈,我选择缺失的行并将它们突出显示为红色,并选择不同的单元格并突出显示它们黄色。

我很想知道我在哪里找到一个范围,然后调用.Select()然后设置Selection.Style。

我已经在做:oldInstance.Application.ScreenUpdating = false;

只是想知道是否有任何其他建议提高性能?

在下面的代码中有很多循环等,但主要性能打击似乎实际上是在Excel中应用格式(如果我注释掉.Select并设置Selection.Style它的代码更快)。

IEnumerable<DataRow> oldOnly = oldTable.Rows.OfType<DataRow>().Except(newTable.Rows.OfType<DataRow>(), lambdaComparer); 
    int oldOnlyRows = 0; 
    foreach (var dataRow in oldOnly) 
    { 
    int excelRowIndex = dataRow[ addedRowIndexColumnName ].ToString().ParseInt() + 2; 
    // Logger.Info("Row: {0} Old Only: {0}",excelRowIndex , dataRow[ keyColumnName ]); 
    (oldInstance.ActiveSheet.Rows[ excelRowIndex ] as Range).Select(); 
    oldInstance.Selection.Style = "Bad"; 
    oldOnlyRows++; 
    } 


    int newOnlyRows = 0; 
    IEnumerable<DataRow> newOnly = newTable.Rows.OfType<DataRow>().Except(oldTable.Rows.OfType<DataRow>(), lambdaComparer); 
    foreach (var dataRow in newOnly) 
    { 
    int excelRowIndex = dataRow[ addedRowIndexColumnName ].ToString().ParseInt() + 2; 
    // Logger.Info("Row: {0} New Only: {0}", excelRowIndex, dataRow[ keyColumnName ]); 
    (newInstance.ActiveSheet.Rows[ excelRowIndex ] as Range).Select(); 
    newInstance.Selection.Style = "Bad"; 
    newOnlyRows++; 
    } 

    int differentCells = 0; 
    var enumerable = ((from o in oldTable.Rows.OfType<DataRow>() join n in newTable.Rows.OfType<DataRow>() on o[ keyColumnName ] equals n[ keyColumnName ] select new { o, n })); 
    foreach (var x1 in enumerable) 
    { 
    for (int i = 0; i < newTable.Columns.Count -1; i++) // use Count - 1 so we ignore the last "RowIndex" column 
    { 
     if (x1.o[ i ].ToString() != x1.n[ i ].ToString()) 
     { 
      int oldExcelRowIndex = x1.o[ addedRowIndexColumnName ].ToString().ParseInt() + 2; 
      var oldRange = oldInstance.GetCell(oldExcelRowIndex, i + 1); 
      oldRange.Select(); 
      oldInstance.Selection.Style = "Neutral"; 

      int newExcelRowIndex = x1.n[ addedRowIndexColumnName ].ToString().ParseInt() + 2; 
      var newRange = newInstance.GetCell(newExcelRowIndex, i + 1); 
      newRange.Select(); 
      newInstance.Selection.Style = "Neutral"; 
      differentCells ++; 
     } 
    } 
    } 
+0

你为什么不使用条件格式? Excel的条件格式化功能可以解决您的问题? – McKay

+0

我不认为我可以在比较两个不同工作表的缺失行和不同数据时使用条件格式。 – Derek

+0

将要格式化的所有单元格放入Range对象,然后在最后将格式应用于Range。 – reggaeguitar

回答

0

诀窍是避免调用Select。

例如:

(oldInstance.ActiveSheet.Rows[ excelRowIndex ] as Range).Select(); 
oldInstance.Selection.Style = "Bad"; 

应该是:

(oldInstance.ActiveSheet.Rows[ excelRowIndex ] as Range).Style = "Bad"; 

这需要从41秒我格式代码下降至9秒。