繁体   English   中英

使用MSBuild更改.xla文件

[英]Change .xla File with MSBuild

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

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

我对如何自动化这个过程感到茫然。 我能想到的最好的是excel宏或Auto-IT脚本。 我也可以写一个自定义的MSBuild任务,但这可能会变得棘手。 还有其他人有其他建议吗?

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

我不是100%确定如何完全按照你的要求做。 但是猜测你想到的目标有几种可能性。

1)将您的Globals的一部分(或全部)作为与.XLA一起分发的单独文本文件,我将其用于外部引用,例如应用程序其余部分的版本。 在构建时写下这个并分发,并阅读XLA的负载。

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

3)如果你只是想更新XLA,以便它包含在你的版本控制系统或类似的(我在这里猜测)可能只是触摸文件,使它看起来像是改变了。

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

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

Chip Pearson优秀网站上的例子可以帮助您入门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM