2014-04-10 63 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秒。