我构建了一个VB.Net应用程序,它将数据加载到Excel电子表格中。该应用程序运行正常,但我添加了一项功能来测试工作簿是否为Open,如果是,则应用程序终止。否则,如果工作簿未打开,则用户可以继续填写应用程序中的信息。我的问题是,当工作表未打开时,由于工作簿正在以某种方式打开,我的代码会爆炸。"我需要关闭任何进程,然后继续。这是我的代码,用于检查工作簿是否已打开:
1st,我的模块,它设置了一个布尔检查:
Public Module ExcelCheck
Public Function Test(ByRef sName As String) As Boolean
Dim fs As FileStream
Try
fs = File.Open(sName, FileMode.Open, FileAccess.Read, FileShare.None)
Test = False
Catch ex As Exception
Test = True
End Try
End Function
End Module
然后我的处理程序在表单上执行检查:
Private Sub btnOpenFileCheck_Click(sender As Object, e As EventArgs) Handles btnOpenFileCheck.Click
'Evaluate if the workbook is being used:
Dim bExist As Boolean
bExist = Test("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls")
If bExist = True Then
MessageBox.Show("The file is open... Please try again later.", "EXCEL FILE IN USE: Abort", MessageBoxButtons.OK)
Me.Close()
Else bExist = False
MessageBox.Show("The file is NOT open... You may proceed...", "EXCEL FILE NOT OPEN", MessageBoxButtons.OK)
Dim xlOpenItem As New Excel.Application
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
xlOpenWB.Close(SaveChanges:=False, Filename:="\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls", RouteWorkbook:=False)
txtCPUSerial.Focus()
End If
End Sub
当书籍没有打开时会发生什么事情是通过插图继续运行的正确对话框:
但随后会出现一个Excel对话框,说明如下:
' \\ netshareA \ C $ \ Users \用户皮特\桌面\ TestUnits \ Machines.xls' 目前正在使用中。稍后再试。
然后,它最终爆炸,我有引用的行:
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
我的逻辑是我需要一个Excel对象的打开实例,然后关闭该实例以终止任何无意的运行进程。我实际上在另一个提交处理程序中打开工作簿,Excel对象和变量设置得很好,但这不是我的问题。我如何顺利确保此处关闭工作簿对象,以便不抛出它不是的例外?
答案 0 :(得分:0)
经过多次修补后,我发现了我的问题 - 我没有关闭打开的文件流:
Public Module ExcelCheck
Public Function Test(ByRef sName As String) As Boolean
Dim fs As FileStream
Try
fs = File.Open(sName, FileMode.Open, FileAccess.Read, FileShare.None)
Test = False
fs.Close() 'This closes out the initially opened file stream for checking.
Catch ex As Exception
Test = True
End Try
End Function
End Module
我最终回到模块,想知道如果我只是关闭并使用fs.Close()
会发生什么,并且它可以解决问题。没有更多的爆炸!希望这可以帮助其他可能遇到类似文件流问题的人。