2017-02-22 15 views
0

В настоящее время я реализую метод, который сгенерировал несколько листов и экспортировал их как PDF. Для этого я использую библиотеку Microsoft.Office.Interop (v14.0.0.0) с .NET 4.5.2. Запуск офис является 2016.Net Interop Excel ExportAsFixedFormat() Exception 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 

Это прекрасно работает, если я запускаю этот код для одной итерации BUT Я заметил, что EXCEL-Process все еще работает.

Если я пытаюсь сделать это в пакетном режиме (в смысле для цикла) я получаю excetion при вводе 2-й Интерактивного:

System.Runtime.InteropServices.COMException (0x800A03EC) : Ausnahme фон HRESULT: 0x800A03EC Bei Microsoft.Office.Interop.Excel.WorkbookClass.ExportAsFixedFormat (XlFixedFormatType Тип, объект файла, объект, качество IncludeDocProperties объектов, IgnorePrintAreas Object, Object From, To Object, Object OpenAfterPublish, объект FixedFormatExtClassPtr) Bei контроллер .CreateListing (данные DataTable, Int32 year, String mandantShortName) в ...

линия, которая бросает исключение:

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

Для Reseach/тестирования я отлажена до того повторного входа в петлю и убил первенствовать-процесс, но без каких-либо изменений.

Кто-нибудь сталкивался с этой проблемой? Решения/предложения?

+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

Я только что понял, в чем проблема (собственная ошибка).

Но он все еще оставляет открытым вопрос, почему Excel-Proccess не закрывается.

+1

Ну, у меня просто была ошибка внутренней реализации, которая не имеет значения в этом контексте. – dpa

Смежные вопросы