2014-04-10 2 views
0

두 데이터 테이블의 데이터를 두 개의 Excel 워크 시트에 수동으로 복사 한 다음 두 데이터 테이블의 데이터를 비교하는 코드가 있습니다.많은 셀과 행에 수동으로 서식을 적용하는 동안 자동화 성능이 우수합니다.

Excel에 데이터를 삽입하는 성능이 뛰어 났지만 누락 된 행을 선택하여 빨간색으로 강조 표시하고 다른 셀을 선택하고 강조 표시하는 병목이 있다고 생각합니다. 노랑.

나는 범위를 찾고 호출에 대해 궁금합니다 .Select()를 호출하고 Selection.Style을 설정하십시오.

저는 이미하고 있습니다 : oldInstance.Application.ScreenUpdating = false;

성능 향상을위한 다른 제안이 있는지 궁금하십니까?

아래 코드에는 루핑 등이 많이 있지만, 주요 성능 히트는 실제로 Excel에서 형식을 적용하는 것으로 보입니다. (내가 선택한 코드를 주석 처리하고 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

트릭은 선택 호출을 피하는 것입니다. 예를 들어

:

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

은 다음과 같아야합니다

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

이 9 초 아래로 41초에서 내 서식 코드를합니다.