2015-02-06 2 views
0

Excel 파일을 열고 데이터 소스를 새로 고치고 C#으로 PDF로 저장합니다. this 같은 코드 샘플을 기반으로합니다. 그러나 최종 릴리스 호출 후에도 파일은 잠긴 상태로 유지됩니다.Excel Interop을 사용하여 파일을 열면 잠김 파일

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 

// Open the Workbook: 
Microsoft.Office.Interop.Excel.Workbook wb = excelApp.Workbooks.Open(
    @"c:\test\test.xlsx", 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1]; 

wb.RefreshAll(); 
Thread.Sleep(4000); //surely a better way to do this 

//ws.PrintOut(Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
wb.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, @"c:\test\test.pdf"); 

// Cleanup: 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

Marshal.FinalReleaseComObject(ws); 

wb.Close(false, Type.Missing, Type.Missing); 
Marshal.FinalReleaseComObject(wb); 

excelApp.Quit(); 
Marshal.FinalReleaseComObject(excelApp); 

프로세스를 완료 한 후에 잠글 수없는 추가 단계는 무엇입니까?

답변

1
  1. 나는 당신이 여기에서 순서에 어긋나는 작업을하고 있다고 생각합니다. 즉, 응용 프로그램이나 워크 북을 닫기 전에 수집하는 것입니다.
  2. 워크 시트, 통합 문서, 응용 프로그램 및 processID와 같은 Excel 개체의 각 부분을 정리하는 시점까지 왔습니다. 이것은주의의 풍부일지도 모르지만, 당신이 당신의 기억 IMO를 청소하고 있다는 것을 확실하기 위하여.
  3. 필자는이 문제에 대해 잘 모릅니다. 그러나 나는 PDF를 내보내는 데 더 자세한 설명을 사용하는 경향이 있습니다. 나는 그것을 고려할 것이다.

    xlWorkbook.ExportAsFixedFormat (Excel.XlFixedFormatType.xlTypePDF, filepath, Excel.XlFixedFormatQuality.xlQualityStandard, true, false, 1, 1, true, missing);

내 자신의 작업에 대해 수행 한 작업은 유령 프로세스를 죽이는 작업 (아마도 잠금을 유발하는 작업)을 처리하는 두 가지 함수를 만드는 것입니다.

내 코드는 내게 singleExcel이라는 Excel 인스턴스를 처리하기 위해 만든 클래스 안에 패키지되어 있으므로 필요에 따라 조정할 수 있지만 직접 가져와야합니다.

public Excel._Worksheet xlWorksheet { get; set; } 
public Excel.Application xlApp { get; set; } 
public Excel.Workbook xlWorkbook { get; set; } 
public Process excelProcess { get; set; } 

public static void CloseSheet(singleExcel thisExcel) 
{ 
    if (thisExcel.excelProcess != null) 
    { 
     try 
     { 
      thisExcel.excelProcess.Kill(); 
      thisExcel.excelProcess.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      // depending on your needs 
     } 
    } 
    else 
    { 
     thisExcel.xlWorkbook.Close(true); 
     thisExcel.xlApp.Quit(); 
    } 
    releaseObject(thisExcel.xlWorksheet); 
    releaseObject(thisExcel.xlWorkbook); 
    releaseObject(thisExcel.xlApp); 
    releaseObject(thisExcel.excelProcess); 
    releaseObject(thisExcel); 
} 

public static void releaseObject(object obj) 
{ 
    try 
    { 
     Marshal.ReleaseComObject(obj); 
     obj = null; 
    } 
    catch 
    { 
     obj = null; 
    } 
    finally 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 
+0

감사합니다. – Roger

관련 문제