2011-09-28 2 views
4

Exce를 사용하여 Excel 파일을 올바르게 닫고 저장하는 방법에 대한 좋은 문서를 찾는 데 어려움을 겪고 있습니다. Office Interop dll입니다.Excel Office Interop dll을 사용하여 C# .Net으로 작성된 Excel 파일 저장 및 닫기

기본적으로 새 Excel 통합 문서를 만들고 목록의 데이터로 첫 번째 워크 시트를 채우는 데 필요한 모든 작업을 수행합니다 (응용 프로그램 개체에서 visible 속성을 true로 설정하면 Excel 파일을 열어 볼 수 있음) 워크 시트는 정확히 내가 원하는 방식으로 제공됩니다.)

Excel 파일을 올바르게 닫고 선택한 위치에 저장하는 방법을 알아야합니다. 나는 코드가 완료되었을 때 Excel을 완전히 죽이고 싶습니다. 끝나면 메모리를 계속 보유하고 싶지는 않습니다.

는 지금 내가 데이터와 워크 시트를 작성 후 다음을 수행하고 내가 원하는 :

workbook.Save(); 
workbook.Close(Type.Missing, Type.Missing, Type.Missing); 
application.Quit(); 

업데이트 : 지금 엑셀 내가 원하는 위치에 파일을 저장 할 수 있어요. 간단히 Save() 호출을 제거하고 Close 호출을 (true, filePath, Type.Missing)으로 변경했으며 이제 파일을 원하는 위치에 저장합니다.

COM 개체를 올바르게 닫는 것이 문제 해결에만 있습니다.

가능한 해결책 최소한이 코드는 실행이 완료 될 때마다 작업 관리자에서 Excel을 제거하는 것처럼 보입니다.

// Close the workbook, tell it to save and give the path. 
workbook.Close(true, workbookPath, Type.Missing); 

// Now quit the application. 
application.Quit(); 

// Call the garbage collector to collect and wait for finalizers to finish. 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

// Release the COM objects that have been instantiated. 
Marshal.FinalReleaseComObject(workbook); 
Marshal.FinalReleaseComObject(worksheet); 
Marshal.FinalReleaseComObject(workrange); 
Marshal.FinalReleaseComObject(application); 

나는 이것이 효과가 있다고 믿는다. 문제는 내가 인스턴스화 한 모든 것을 공개하지 않고 GC가 강제로 수집하도록 강요하는 것이 마지막 누락 된 부분이라고 생각합니다. 이 작업을 20 번 실행하고 작업 관리자가 Excel을 표시하고 코드가 완료되면 제거합니다.

최종 업데이트 : 위의 코드는 모든 COM 개체를 삭제하고 있으며 모든 것이 제대로 작동하고 있습니다.

+0

보기 ... 항상 모든 cicumstances에서 .NET에서 COM 개체를 제거하지만 Quit()에 대한 호출 후 Marshal.FinalReleaseComObject (application); application = null;를 추가하는 것은 당신의 기회를 증가하려면에는 100 % 방법이 없습니다 그 말이 내게 보이는데, 당신이 옳은 일을하지 않을 수도 있다고 의심하게 만드는 것은 무엇입니까? – Mathias

+0

코드가 실행 된 후에도 여전히 Excel이 작업 관리자에 표시됩니다. 단지 거기에 머무르고 메모리를 차지하지 않으려는 경우에만 필요합니다. –

+0

그렇다면 문제는 Excel을 닫는 것이 아니라 다른 Excel 개체를 삭제하는 것입니다. 당신을 도울 수있는이 StackOverflow 질문을 확인하십시오. http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c – Mathias

답변

1
+0

나는 운이없는 그것을 시도했다. FinalReleaseComObject 메서드의 반환 값을 확인한 결과 값은 0이지만 해제되었음을 의미하지만 여전히 작업 관리자에서 Excel이 표시됩니다. –

+0

다음 유일한 옵션 (나쁜 연습!) 엑셀의 프로세스 ID를 찾아 그것을 죽이는 것입니다 ... – Yahia