2013-10-16 2 views
2

Excel Interop을 사용하여 일부 Excel 시트 작업을하고 있습니다. 워크 시트에서 행을 반복해야하고 행의 첫 번째 셀이 비어 있으면 전체 행을 삭제해야합니다. 나는 다음을 시도했다 :C# Interop - 행 반복 및 삭제

Excel.Range excelRange = sheet.UsedRange; 
foreach (Excel.Range row in excelRange.Rows) 
{ 
String a = ((Excel.Range)row.Cells[Type.Missing, 1]).Value2 as String; 
if (a == null || a == "") 
{ 
    ((Excel.Range)row).Delete(Type.Missing); 
} 
} 

이것은 전혀 작동하지 않았다. 이 작업을 수행하는 다른 방법이 있습니까?

그리고 워크 시트의 모든 수식을 빨리 찾아서 제거 할 수 있습니까?

+1

것부터 먼저 ... 당신은 버전 VS 어떤을 사용하고 있습니까? –

+0

@SiddharthRout - VS 2008을 사용하고 있습니다. – user2531191

+0

Ok. 나는 VS 2010을 가지고 있으며, 2008 년에 작동하지 않을 코드가 있습니다. –

답변

3

Excel 파일이 이렇게 보인다고 가정 해 보겠습니다.

enter image description here

한 번에 전체 행을 삭제 한 후 빈 값 골를 필터링 할 자동 필터라는 Excel의 붙박이 기능을 사용하는 것입니다 행을 삭제하는 가장 좋은 방법.

시도

이 (VS 2010 궁극에서) 테스트 완료 : 나는 VS 2008가 없기 때문에 내가 VS 2008에서 오류 수 느끼는 몇 줄을 변경, 내가 모를 수가 거기서 시험해 보지 마라. 오류가 발생하면 알려 주시면 해결할 것입니다.

//~~> Open File 
private void button1_Click(object sender, EventArgs e) 
{ 

    Microsoft.Office.Interop.Excel.Application xlexcel; 
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 
    Microsoft.Office.Interop.Excel.Range xlRange; 
    Microsoft.Office.Interop.Excel.Range xlFilteredRange; 

    xlexcel = new Excel.Application(); 

    xlexcel.Visible = true; 

    //~~> Open a File 
    xlWorkBook = xlexcel.Workbooks.Open("C:\\MyFile.xlsx", 0, false, 5, "", "", true, 
    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

    //~~> Work with Sheet1 
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

    //~~> Get last row in Col A 
    int _lastRow = xlWorkSheet.Cells.Find(
            "*", 
            xlWorkSheet.Cells[1,1], 
            Excel.XlFindLookIn.xlFormulas, 
            Excel.XlLookAt.xlPart, 
            Excel.XlSearchOrder.xlByRows, 
            Excel.XlSearchDirection.xlPrevious, 
            misValue, 
            misValue, 
            misValue 
           ).Row ; 

    //~~> Set your range 
    xlRange = xlWorkSheet.Range["A1:A" + _lastRow]; 

    //~~> Remove any filters if there are 
    xlWorkSheet.AutoFilterMode=false; 

    //~~> Filter Col A for blank values 
    xlRange.AutoFilter(1, "=", Excel.XlAutoFilterOperator.xlAnd, misValue, true); 

    //~~> Identigy the range 
    xlFilteredRange = xlRange.Offset[1,0].SpecialCells(Excel.XlCellType.xlCellTypeVisible,misValue); 

    //~~> Delete the range in one go 
    xlFilteredRange.EntireRow.Delete(Excel.XlDirection.xlUp); 

    //~~> Remove filters 
    xlWorkSheet.AutoFilterMode = false; 

    //~~> Close and cleanup 
    xlWorkBook.Close(true, misValue, misValue); 
    xlexcel.Quit(); 

    releaseObject(xlRange); 
    releaseObject(xlFilteredRange);  
    releaseObject(xlWorkSheet); 
    releaseObject(xlWorkBook); 
    releaseObject(xlexcel); 
} 

private void releaseObject(object obj) 
{ 
    try 
    { 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
     obj = null; 
    } 
    catch (Exception ex) 
    { 
     obj = null; 
     MessageBox.Show("Unable to release the Object " + ex.ToString()); 
    } 
    finally 
    { 
     GC.Collect(); 
    } 
} 

출력

enter image description here

+0

이 코드는 VS 08과 호환되지 않습니다. 줄 번호 11 (// ~~> Col ​​A의 마지막 행 가져 오기) 'End'속성을 사용할 수 없습니다. – user2531191

+0

게시물을 업데이트했습니다. 이제 해봐 / –