【问题标题】:WinForms COM Exception opening Excel workbookWinForms COM 异常打开 Excel 工作簿
【发布时间】:2015-10-21 16:13:46
【问题描述】:

我正在使用 VB.Net 编写一个非常基本的 WinForms 应用程序,一切都很顺利,直到我尝试打开一个我通过 Stream 对象写入tempLocation 的 Excel 文件(工作簿在我的项目中资源和构建操作设置为“嵌入式资源”)

这是导致错误的代码:

Dim xlWBTemp As Excel.Workbook
Dim xlApp As Excel.Application
'// Below resolves to "C:\Users\MacroMan\LockTemplate.xlsm"
Dim tempLocation As String = Environ("USERPROFILE") & "\LockTemplate.xlsm"
...
xlWBTemp = xlApp.Workbooks.Open(tempLocation) '<~~ error here.

我得到的错误是:

System.Runtime.InteropServices.COMException 未处理
错误代码=-2146827284
HResult=-2146827284
消息=来自 HRESULT 的异常:0x800A03EC

我已经检查过,文件确实已创建,Excel 正在运行并且此时已成功打开工作簿。我根本无法弄清楚这一点,所以任何指针都非常受欢迎。


更新:

文件 (tempLocation) 确实存在于正确的位置,但是当我在应用程序之外打开它时,Excel 给了我“发现不可读的内容”错误。该文件仍然可以成功打开,并且打开后没有任何问题。我现在可以通过在Workbooks.Open() 方法中使用CorruptLoad 参数来解决这个错误,但我觉得这是盲目地忽略这个问题。

【问题讨论】:

  • 你能在代码之外打开文件吗?这是一个好文件吗?
  • @varocarbas 这是用户选择文件的数组列表,该位工作正常。
  • @MatthewD 很好 - 我尝试从外部打开文件并收到“发现无法读取的内容”消息。然后文件打开,没有任何遗漏,功能齐全 - 那么我创建它的方式有什么问题吗?
  • @varocarbas tempLocation 是具有完整文件路径/名称的字符串
  • 恕我直言,您最初发布的所有代码都与此问题相关,因为您的方法可能是导致问题的原因。

标签: vb.net winforms excel-interop


【解决方案1】:

如果有帮助的话,这里有一个简单的 VB.NET 应用程序示例,我很久以前就编写了该应用程序来测试 VB 与 C# 的速度。这是创建工作簿和写入工作簿的不同方式。

Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim xlApp As New Excel.Application
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim misValue As Object = System.Reflection.Missing.Value

        xlWorkBook = xlApp.Workbooks.Add(misValue)
        xlWorkBook.Application.Visible = True
        xlWorkBook.Application.ScreenUpdating = False

        xlWorkSheet = xlWorkBook.Sheets("sheet1")
        xlWorkSheet.SaveAs("C:\\vbexcel.xlsx")

        Dim l As Long
        l = 1
        Do While l < 500
            'xlWorkSheet.Cells(l, 1) = l
            xlWorkSheet.Range("A" & l).Value = l
            'xlWorkSheet.Cells(l, 2) = l
            'xlWorkSheet.Cells(l, 3) = l
            l = l + 1
        Loop

        xlWorkBook.Application.ScreenUpdating = True
        xlWorkBook.RefreshAll()
        xlWorkBook.Save()

        'xlWorkBook.Close()
        'xlApp.Quit()

        releaseObject(xlApp)
        releaseObject(xlWorkBook)
        releaseObject(xlWorkSheet)

        MsgBox("Done")
    End Sub

    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

【讨论】:

  • 感谢您的努力,不幸的是,原始文件在我的项目资源中,这就是为什么我不得不使用 Stream 对象将其写入另一个位置的原因 - 虽然是 Excel 互操作的一个很好的例子: )
  • 这样我得到,“类型'Excel.Application'没有定义。”在第一行(“Dim xlApp As New Excel.Application”)。
  • @B. Clay Shannon 这很可能与 VS 版本和参考版本有关。这些年来发生了一些变化。实际上,当我把它挖出来并让它在 VS2010 中工作以在此处发布时,我实际上不得不更改该行。当我回到我的电脑时,我会发布它在旧版 VS 中的方式。
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多