使用MSBuild更改.xla文件

时间:2020-03-05 18:59:47  来源:igfitidea点击:

我正在尝试为当前项目创建一个构建脚本,其中包括一个Excel加载项。外接程序包含一个VBProject,其文件modGlobal带有变量version_Number。每个构建都需要更改此数字。确切步骤:

  • 用Excel打开XLA文档。
  • 切换到VBEditor模式。 (Alt + F11)
  • 打开VBProject,输入密码。
  • 打开modGlobal文件。
  • 将变量的默认值更改为当前日期。
  • 关闭并保存项目。

我对如何实现流程自动化一无所知。我能想到的最好的是一个Excel宏或者Auto-IT脚本。我也可以编写一个自定义MSBuild任务,但这可能会很棘手。还有其他人有其他建议吗?

解决方案

回答

我不确定100%如何准确地执行要求。但是,猜测我们要实现的目标有几种可能性。

1)将Globals的一部分(或者全部)做成一个单独的文本文件。在构建时编写并分发,然后阅读XLA的负载。

2)我猜我们正在编写应用程序的主要组件(即非XLA部分)的版本。如果这是tru,为什么将其存储在XLA中?为什么不让应用程序的主要部分允许XLA的某些版本正常工作。主应用程序的1.1版可以接受来自XLA 7.1 8.9版的调用。

3)如果我们只是想更新XLA,使其包含在版本控制系统或者类似的软件中(我猜是在这里),也许只需触摸文件即可,使其看起来已更改。

如果是我们要控制的其余应用程序版本,则只需将其粘贴到文本文件中,然后将其与XLA一起分发即可。

回答

我们可以在Excel中以编程方式修改xla中的代码。我们将需要对" Microsoft Visual Basic应用程序可扩展性.."组件的引用。

Chip Pearson优秀站点上的示例应入门。

回答

处理XLA文件版本控制的另一种方法是使用"文档属性"中的自定义属性。我们可以按照以下说明使用COM进行访问和操作:http://support.microsoft.com/?kbid=224351.

这样做的优点是:

  • 我们可以在不打开XLA文件的情况下检查版本号
  • 我们不需要在构建计算机上使用Excel-仅需要DsoFile.dll组件

另一种选择是将版本号(也可能还有其他配置数据)存储在XLA文件中的工作表上。 XLA的用户看不到该工作表。我过去使用的一种技术是将加载项作为XLS文件存储在源代码管理中,然后作为构建过程的一部分(例如,在Post-Build事件中)运行以下脚本以将其转换为XLA:输出目录。保存之前,可以轻松扩展此脚本以更新工作表中的版本号。就我而言,我这样做是因为我的Excel加载项使用VSTO,而Visual Studio不直接支持XLA文件。

'
'   ConvertToXla.vbs
'
'   VBScript to convert an Excel spreadsheet (.xls) into an Excel Add-In (.xla)
'
'   The script takes two arguments:
'
'   - the name of the input XLS file.
'
'   - the name of the output XLA file.
'
Option Explicit
Dim nResult
On Error Resume Next
nResult = DoAction
If Err.Number <> 0 Then 
    Wscript.Echo Err.Description
    Wscript.Quit 1
End If
Wscript.Quit nResult

Private Function DoAction()

    Dim sInputFile, sOutputFile

    Dim argNum, argCount: argCount = Wscript.Arguments.Count

    If argCount < 2 Then
        Err.Raise 1, "ConvertToXla.vbs", "Missing argument"
    End If

    sInputFile = WScript.Arguments(0)
    sOutputFile = WScript.Arguments(1)

    Dim xlApplication

    Set xlApplication = WScript.CreateObject("Excel.Application")
    On Error Resume Next 
    ConvertFileToXla xlApplication, sInputFile, sOutputFile
    If Err.Number <> 0 Then 
        Dim nErrNumber
        Dim sErrSource
        Dim sErrDescription
        nErrNumber = Err.Number
        sErrSource = Err.Source
        sErrDescription = Err.Description
        xlApplication.Quit
        Err.Raise nErrNumber, sErrSource, sErrDescription
    Else
        xlApplication.Quit
    End If

End Function

Public Sub ConvertFileToXla(xlApplication, sInputFile, sOutputFile)

    Dim xlAddIn
    xlAddIn = 18 ' XlFileFormat.xlAddIn

    Dim w
    Set w = xlApplication.Workbooks.Open(sInputFile,,,,,,,,,True)
    w.IsAddIn = True
    w.SaveAs sOutputFile, xlAddIn
    w.Close False
End Sub