2017-02-22 307 views
0

我目前正在實現一種方法,生成多個工作表並將其導出爲PDF。爲此,我在.NET 4.5.2中使用Microsoft.Office.Interop庫(v14.0.0.0)。運行Office是2016.net互操作Excel ExportAsFixedFormat()異常HResult:0x800A03EC

我的代碼:

Dim excel As New Application() 
excel.Visible = False 
excel.DisplayAlerts = False 
Dim workbooks As Workbooks 
workbooks = excel.Workbooks 
Dim workbook As Workbook = workbooks.Add(Type.Missing) 

[...] 

workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, String.Format(<a Path>) 
ReleaseComObject(workSheet) 
workbook.Close() 
ReleaseComObject(workbook) 
excel.Quit() 
ReleaseComObject(excel) 

的ReleaseComObject的()看起來像這樣(根據Microsoft Support):

Private Sub ReleaseComObject(objectToRelease As Object) 
     While System.Runtime.InteropServices.Marshal.ReleaseComObject(objectToRelease) > 0 
     End While 
     objectToRelease = Nothing 
End Sub 

,如果我對一個迭代運行這段代碼也能正常工作但是我注意到EXCEL-Process仍在運行。

如果我試圖做到這一點在批處理模式(在含義的for循環)我得到進入第二互爲作用時EXCETION:

System.Runtime.InteropServices.COMException(0x800A03EC) :Ausnahme von HRESULT:0x800A03EC bei Microsoft.Office.Interop.Excel.WorkbookClass.ExportAsFixedFormat(XlFixedFormatType類型,對象文件名,對象質量,對象IncludeDocProperties,Object IgnorePrintAreas,Object From,Object To,Object OpenAfterPublish,Object FixedFormatExtClassPtr) bei Controller .CreateListing(DataTable data,Int32 year,String mandantShortName)in ...

行拋出異常:

workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, String.Format(<a Path>) 

對於研製/測試我重新進入循環之前調試並殺死了Excel的過程,但W/O任何變化。

任何人都面臨這個問題?解決方案/建議?

+0

請看這篇文章http://stackoverflow.com/questions/15697282/excel-application-not-quitting-after-calling-quit – Codexer

回答

2

爲了與Excel不能正常關閉更換來解決這個問題:

Private Sub ReleaseComObject(objectToRelease As Object) 
    While System.Runtime.InteropServices.Marshal.ReleaseComObject(objectToRelease) > 0 
    End While 
    objectToRelease = Nothing 
End Sub 

隨着該位的code通過Siddharth Rout所示:

Private Sub ReleaseObject(ByVal obj As Object) 
    Try 
     Dim intRel As Integer = 0 
     Do 
      intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     Loop While intRel > 0 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

你可以使用你的While語句代替Do聲明,但我覺得它讀取更好這種方式。這裏的重要一點是GC.Collect()

您還必須確保您按照正確的順序發佈併發布的所有內容。這通常在後退的順序。所以你的情況,開始了與workSheet那麼workbook然後workbooks然後最後excel

ReleaseObject(workSheet) 
workbook.Close() 
ReleaseObject(workbook) 
ReleaseObject(workbooks) 
excel.Quit() 
ReleaseObject(excel) 

這是我放在一起測試代碼:

Dim app As New Excel.Application() 
app.Visible = False 
app.DisplayAlerts = False 

Dim wbs As Excel.Workbooks = app.Workbooks 
Dim wb As Excel.Workbook = wbs.Add() 
Dim ws As Excel.Worksheet = CType(wb.Sheets(1), Excel.Worksheet) 

ReleaseObject(ws) 
wb.Close() 
ReleaseObject(wb) 
ReleaseObject(wbs) 
app.Quit() 
ReleaseObject(app) 

的過程開始,一旦ReleaseObject(app)被稱爲過程然後關閉。

0

我只是想通了問題所引起的(自己的Bug)。

但是,它仍然使問題開放,爲什麼Excel-Proccess沒有關閉。

+1

嗯,我只是有一個內部的執行錯誤,在這種情況下無關緊要。 – dpa