【问题标题】:.Net Interop Excel ExportAsFixedFormat() Exception HResult: 0x800A03EC.Net Interop Excel ExportAsFixedFormat() 异常 HResult: 0x800A03EC
【发布时间】:2017-07-12 08:25:41
【问题描述】:

我目前正在实施一种生成多张工作表并将它们导出为 PDF 的方法。为此,我将 Microsoft.Office.Interop Library (v14.0.0.0) 与 .NET 4.5.2 一起使用。运行 Office 是 2016 年

我的代码:

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 进程仍在运行。

如果我尝试在批处理模式下执行此操作(在 for 循环的含义中),我会在进入第二次交互时得到一个异常:

System.Runtime.InteropServices.COMException (0x800A03EC):Ausnahme von HRESULT:0x800A03EC bei Microsoft.Office.Interop.Excel.WorkbookClass.ExportAsFixedFormat(XlFixedFormatType 类型,对象文件名,对象质量,对象 IncludeDocProperties,对象 IgnorePrintAreas,对象从,对象到,对象 OpenAfterPublish,对象 FixedFormatExtClassPtr) bei Controller.CreateListing(DataTable data, Int32 year, String mandantShortName) in ...

抛出异常的行:

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

对于研究/测试,我在重新进入循环之前进行了调试并终止了 excel 进程,但没有任何更改。

有人也遇到过这个问题吗?解决方案/建议?

【问题讨论】:

标签: vb.net excel-interop comexception


【解决方案1】:

我刚刚弄清楚问题是什么引起的(自己的Bug)。

但问题仍然悬而未决,为什么 Excel 进程没有关闭。

【讨论】:

  • 嗯,我只是有一个内部实现错误,在这种情况下并不重要。
【解决方案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),进程就会关闭。

【讨论】:

    【解决方案3】:

    尝试以管理员帐户运行应用程序或服务。这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多