2011-03-18 2 views
1

엑셀 스프레드 시트에 데이터를 읽고 쓰려면 C#을 사용하고 있습니다.C#으로 엑셀 종료 (Excel 자동화 사용)

내 엑셀

Excel.Application excelapp = new Excel.Application(); 
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet; 
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet; 

그리고이 두 라인/종료 시트를 저장하는 파일을 열려면 다음 세 문장을 사용하고 있습니다.

workbook.Save(); 
    workbook.Close(); 

문제는 EXCEL 프로세스가 여전히 활성 상태라는 것입니다. (나는 작업 관리자를 사용하여 확인했다.) 그리고 워크 시트에 데이터를 읽고/쓰고 난 후에 나는 20 개의 EXCEL 프로세스가 활성화 된 것처럼 보였다.

누구나 내가 훌륭한 통합 문서를 닫은 후에 바로 excelapp proc를 끝내는 기술을 보여줄 수 있다면.

많은 감사, Aaron.

답변

4

은 간단하게 Excel에서 모든 작업 후

excelapp.Quit(); 

를 호출합니다. 뿐만 아니라 모든과 함께, 당신은뿐만 아니라 당신의 excelapp 개체와 ReleaseComObject를 사용할 필요가 있다는

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp); 
excelapp = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

참고 : 프로세스가 계속 실행하면

, 모든 Excel 개체에 Marshal.ReleaseComObject를 사용하고 즉시 가비지 수집을 강제로 시도 워크 북과 워크 북을 읽으십시오.

+0

+1 좋은 답변입니다. 내 응용 프로그램에서도 사용하겠습니다! – gideon

4

궁수는 올바른 경로에 ReleaseComObject으로 표시되지만 가비지 수집을 망칠 필요가있는 경우 자동화 코드에서 실수를 범했습니다.

닫히지 않을 가능성이 가장 큰 이유는 변수에 저장하지 않았기 때문에 해제 할 수없는 개체에 대한 고아 참조가 있다는 것입니다. 일반적인 이유는 하나의 호출에서 여러 "레이어"에 액세스하는 경우입니다. 예를 들어

, 당신은 같은 것을 할 경우 : (? 너무 어쩌면 시트 컬렉션)

통합 문서하는 시트와 범위에
Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1; 

그럼 당신이 만든 것입니다 참조를, 아무도이있는 당신이 할 수있는 적절하게 해제하십시오.

그래서 대신에이 같은 뭔가 단계로 그것을 분할해야합니다 (메모리에서 볼의 늦은 바인딩 시점에서 완전하게 작성하고 난 당신이 해제 할 필요가 뭔가를 놓친 것) :

object wb = Workbooks("Book1"); 
object sheet = wb.Sheets("Sheet1"); 
object range = sheet.Range("A1:A2"); 
range.Value = 1; 

Marshal.ReleaseComObject(range); 
Marshal.ReleaseComObject(sheet); 
Marshal.ReleaseComObject(wb); 

정상적인 상황에서 프로세스를 죽이거나 가비지 콜렉션을 강요 할 필요는 없습니다. 코드를 작성할 때 버그가있을 때만 기억해야합니다.

+0

+1 "가비지 콜렉션을 망칠 필요가 있다면 자동화 코드" – CJBS

관련 문제