使用 MSBuild 更改 .xla 文件

Posted

技术标签:

【中文标题】使用 MSBuild 更改 .xla 文件【英文标题】:Change .xla File with MSBuild 【发布时间】:2010-09-10 08:21:39 【问题描述】:

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

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

我不知道如何使流程自动化。我能想到的最好的方法是一个 excel 宏或 Auto-IT 脚本。我也可以编写一个自定义的 MSBuild 任务,但这可能会变得……很棘手。还有其他人有什么建议吗?

【问题讨论】:

【参考方案1】:

另一种处理 XLA 文件版本控制的方法是使用文档属性中的自定义属性。您可以使用 COM 访问和操作,如下所述:http://support.microsoft.com/?kbid=224351。

这样做的优点是:

无需打开 XLA 文件即可查看版本号

您的构建机器上不需要 Excel - 只有 DsoFile.dll 组件

另一种选择是将版本号(可能还有其他配置数据)存储在 XLA 文件的工作表中。 XLA 的用户将看不到该工作表。我过去使用的一种技术是将加载项作为 XLS 文件存储在源代码管理中,然后作为构建过程的一部分(例如在构建后事件中)运行下面的脚本以将其转换为 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

【讨论】:

另一种版本化 XLA 的方法是,如果您有版本号,则将版本号存储在命令栏/工具栏的属性中(例如,将版本号存储在工具提示中)。如果交换 xla 文件,VBA 代码可能与代码 xla 命令栏不同步。将此工具提示与 VBA 代码进行比较 - 在​​代码中具有与工具提示版本与代码进行比较的功能。然后,您可以从那里删除命令栏并重建它。希望对您有所帮助。【参考方案2】:

我不能 100% 确定如何完全按照您的要求进行操作。但猜测您心中的目标有几种可能性。

1) 将您的部分(或全部)全局文件创建为与 .XLA 一起分发的单独文本文件,我会将其用于外部参考,例如应用程序其余部分的版本。在构建时编写并分发,并在 XLA 的负载上读取。

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

3) 如果您只是想更新 XLA,以便将其包含在您的版本控制系统或类似系统中(我猜这里),也许只需触摸文件,使其看起来像已更改.

如果它是您控制的应用程序其余部分的版本,我只需将其粘贴在一个文本文件中并与 XLA 一起分发。

【讨论】:

【参考方案3】:

您可以在 Excel 中以编程方式修改 xla 中的代码。您需要参考“Microsoft Visual Basic for Applications Extensibility..”组件。

Chip Pearson's excellent site 上的示例应该可以帮助您入门。

【讨论】:

以上是关于使用 MSBuild 更改 .xla 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 pdb 文件包含到我的 nuget (nupkg) 文件中

如何只用visual c++编译器而不安装visual studio

TFSBuild 2013 无法更改 msbuild 版本

MSBuild 如何决定是不是需要重建 C# 库?

更改MsBuild错误消息语言

跟踪MsBuild工具链脚本的执行情况