尝试打开工作簿时出现空引用异常,vb.net

Null reference exception when trying to open a workbook, vb.net

我有一个 openfiledialog 从文本框中读取电子表格文件名,然后执行一些格式化并吐出一个文本文件。该代码一次运行良好;我的下一个任务是获取它,这样我就可以在不关闭程序的情况下打开连续的电子表格(一次一个)。

当我尝试打开第二个 excel 文件时,我在打开工作簿的那一行遇到空引用异常(对象引用未设置为对象的实例)。

Public Class Form1

Dim xlApp As New Microsoft.Office.Interop.Excel.Application
Dim xlWorkbook, xlWorkbook2 As Microsoft.Office.Interop.Excel.Workbook
Dim xlWsheet, xlWsheet2 As Microsoft.Office.Interop.Excel.Worksheet
Dim strm As System.IO.Stream
Dim FormFile As String = "C:\nitemp.tmp\QuantData.xls"

Private Sub Open_Click(sender As Object, e As EventArgs) Handles Open.Click
    'Open button code'
    OpenFileDialog1.Title = "Select a File"
    OpenFileDialog1.InitialDirectory = directory.Text 'uppermost text box, change to open a different default directory with OPEN button'
    OpenFileDialog1.RestoreDirectory = True
    OpenFileDialog1.ShowDialog()
End Sub


Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    Dim lrow As Integer = 0

    Try
        strm = OpenFileDialog1.OpenFile()
        TextBox1.Text = OpenFileDialog1.FileName.ToString()
        xlWorkbook = xlApp.Workbooks.Open(TextBox1.Text) 'opens excel file'
        xlApp.Visible = False
        strm.Close()

我在这里看到两个可能的空引用:1) 上一行的 .ToString 可能为空。 WI 运行 代码,文本框没有被正确的文件路径填充。只有在弹出错误框并且我点击 'continue' 后,文本框才会显示正确的路径。 2) 平台问题,64x 还是 32x?这是在搜索中出现的,所以我尝试了 "New Excel.App" 和 "New Excel.Workbook",然后更改为 x86 平台,但这让我遇到了臭名昭著的 COM 异常 80040154,这让我觉得这不是真正的问题,但是我对编码还是很陌生..

有人能找到 null 吗?

首先,您不需要调用 OpenFileDialog1.OpenFile()。事实上,您根本不需要获取文件流,因为您没有直接操作文件(只有 Excel 是)。

其次,您需要单独检索和处理 xlApp.Workbooks 集合,否则您将泄漏一些 COM 包装器。空引用异常可能来自 Workbooks 集合为空,或者打开的文件名为空。一些错误处理将解决您的问题。

...
Dim xlWorkbooks as Excel.Workbooks
Dim xlWorkbookOpened as Excel.Workbook

Try
    TextBox1.Text = OpenFileDialog1.FileName.ToString()
    If (TextBox1.Text IsNot Nothing) Then
        xlWorkbooks = xlApp.Workbooks
        If (xlWorkbooks IsNot Nothing) Then
            xlWorkbookOpened = xlWorkbooks.Open(TextBox1.Text) 'opens excel file'
            If (xlWorkbookOpened IsNot Nothing) Then
                ' DO WHATEVER YOU NEED TO...        
                Marshal.ReleaseComObject(xlWorkbookOpened)
                xlWorkbookOpened = Nothing
            End If
            Marshal.ReleaseComObject(xlWorkbooks)
            xlWorkbooks = Nothing
        End If
    End If

Catch ex As Exception
    ' Log error to start with...
    Trace.WriteLine(ex.Message)
End Try

请注意,我已在使用后明确释放每个 COM 对象并将值设置为 Nothing。这是确保正确清理所必需的。