使用MSBuild更改.xla文件

4
我正在尝试为我的当前项目创建一个构建脚本,其中包括一个Excel插件。该插件包含有一个VBProject文件,其中包含一个名为modGlobal的变量version_Number。每次构建都需要更改此数字。具体步骤如下:
  1. 使用Excel打开XLA文档。
  2. 切换到VBEditor模式(Alt + F11)
  3. 输入密码,打开VBProject。
  4. 打开modGlobal文件。
  5. 将变量的默认值更改为当前日期。
  6. 关闭并保存项目。
我不知道如何自动化这个过程。我能想到的最好的方法是编写一个Excel宏或Auto-IT脚本。我也可以编写一个自定义的MSBuild任务,但可能会比较棘手。是否还有其他建议?
3个回答

3
处理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

另一种版本控制XLA的方法是将版本号存储在命令栏/工具栏的属性中(例如,在工具提示中存储版本号)。如果交换XLA文件,则VBA代码可能会与代码xla命令栏不同步。将此工具提示与VBA代码进行比较-在代码中编写一个函数,将其与工具提示版本进行比较。从那里,您可以删除命令栏并重新构建它。希望这有所帮助。 - ozmike

1

我不确定如何精确地按照您的要求完成。但是猜测您的目标,有几种可能性。

1)将Globals的一部分(或全部)制作成一个单独的文本文件,并随着.XLA一起分发。我会将其用于外部引用,例如应用程序的版本。在构建时编写并分发,然后在加载XLA时读取。

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

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

如果您要控制剩余应用程序的版本,我建议您将其放入文本文件中,并将其与XLA一起分发。


0

你可以在Excel内部以编程方式修改xla代码。您需要引用“Microsoft Visual Basic for Applications Extensibility..”组件。

Chip Pearson的优秀网站上的示例应该能让您入门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接