Microsoft Excel Interop版本

时间:2018-02-21 01:39:13

标签: excel vb.net office-interop

我有一个Windows Forms应用程序,可以部署到整个网络中的许多用户计算机上。我们的一些用户拥有Excel 2010,其中一些拥有2013年,另一些拥有2016年。

过去,我已指示开发人员使用Interop版本14进行编译,以确保不同版本之间的互操作性。不幸的是,有几次,这个请求没有得到尊重,我们遇到了用户问题。

了解我不是唯一的编码,如何最好地确保在编译应用程序时,使用interop版本14进行编译。

我考虑过的一些选项包括:

  • 在程序中添加内容以检查应用程序运行时的互操作,如果不是版本14,则抛出错误。虽然这是一种奇怪的方法,但如果使用错误的互操作版本
  • ,它将确保开发人员无法测试他们的代码
  • 构建后事件。我不确定这是否正确,或者确切地知道如何做到这一点。

寻找任何建议。感谢。

2 个答案:

答案 0 :(得分:0)

我根本不会使用互操作。很多事情都可能出错。我会使用像NPOI或OpenXML sdk这样的库来创建电子表格。

https://github.com/tonyqus/npoi

http://vbnpoi.blogspot.com/

https://msdn.microsoft.com/en-us/library/office/bb448854.aspx

答案 1 :(得分:0)

我有一个方法,我将放入DLL:

''' <summary>
''' Checks the Version of Excel
''' It's Purpose Is To Ensure We Don't Deploy Wrong Interop Version
''' </summary>
''' <remarks></remarks>
Public Shared Sub CheckVersion(ByVal typeName As String, ByVal maximumVersion As Integer)

    Try

        Dim a2 As System.Reflection.Assembly = System.Reflection.Assembly.ReflectionOnlyLoad(typeName)
        Dim majorVersion As Integer = a2.GetName().Version.Major
        If majorVersion > maximumVersion Then
            Throw New ApplicationException("Invalid Version of " & typeName & " - Using Version " & majorVersion & " - Maximum Allowed Version " & maximumVersion)
        End If
    Catch iex As System.IO.FileNotFoundException
        Trace.WriteLine("VersionChecker - CheckVersion " & iex.Message & Environment.NewLine & iex.StackTrace)
        Throw New ApplicationException("File Not Found " & typeName & " - Note only works for interop types when Embed interop types is disabled and CopyLocal is true.", iex)
    Catch ex As Exception
        Trace.WriteLine("VersionChecker - CheckVersion " & ex.Message & Environment.NewLine & ex.StackTrace)
        Throw ex
    End Try

End Sub

然后将它放入程序中:

VersionChecker.CheckVersion("Microsoft.Office.Interop.Excel", 14)

如果他们在程序的负载上使用了错误的那个,那就会炸弹,确保他们总能正确行事。

我不会接受,或许会有更好的事情发生。