我正在研究VIsusal工作室应用程序。我正在尝试打开excel并读取数据。并将excel保存到不同的位置。
然后,当我打破/结束applcation并重新运行时,“excel正被另一个用户修改。打开为readonly”
当我去prcoess并使用“任务管理器”杀死它时,它再次起作用。
所以我通过代码完成了:
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Dim proc As System.Diagnostics.Process
For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
proc.Kill()
Next
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub
仍然在抛出相同的信息“excel被另一个用户修改。打开为readonly”
请帮助完成这项工作。
答案 0 :(得分:1)
Excel中自动化的一个大问题是,您需要确保在使用它们时关闭每个引用(通过在其上调用ReleaseComObject)。
例如,以下代码将导致Excel保持打开状态:
var range;
range = excelApplication.Range("A1");
range = excelApplication.Range("A2");
System.Runtime.InteropServices.Marshal.ReleaseComObject(range)
range = Nothing
这是因为调用中仍有一个参考值来获取范围“A1”。
因此,我建议在Excel类周围编写一个包装器,以便对访问新范围之前访问的任何先前范围释放任何访问范围。
作为参考,这里是我用来在我写的类中释放COM对象的代码:
Private Sub ReleaseComObject(ByVal o As Object)
Try
If Not IsNothing(o) Then
While System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0
'Wait for COM object to be released.'
End While
End If
o = Nothing
Catch exc As System.Runtime.InteropServices.COMException
LogError(exc) ' Suppress errors thrown here '
End Try
End Sub