excel正被另一个用户修改。打开为readonly

时间:2011-08-09 06:48:30

标签: .net excel

我正在研究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”

请帮助完成这项工作。

1 个答案:

答案 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