尝试打开工作簿时出现空引用异常,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。这是确保正确清理所必需的。
我有一个 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。这是确保正确清理所必需的。