使用 MSBuild 更改 .xla 文件

发布于 2024-07-04 09:45:34 字数 430 浏览 10 评论 0原文

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

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

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

I'm trying to create a build script for my current project, which includes an Excel Add-in. The Add-in contains a VBProject with a file modGlobal with a variable version_Number. This number needs to be changed for every build. The exact steps:

  1. Open XLA document with Excel.
  2. Switch to VBEditor mode. (Alt+F11)
  3. Open VBProject, entering a password.
  4. Open modGlobal file.
  5. Change variable's default value to the current date.
  6. Close & save the project.

I'm at a loss for how to automate the process. The best I can come up with is an excel macro or Auto-IT script. I could also write a custom MSBuild task, but that might get... tricky. Does anyone else have any other suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

微凉徒眸意 2024-07-11 09:45:34

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

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

You can modify the code in the xla programmatically from within Excel. You will need a reference to the 'Microsoft Visual Basic for Applications Extensibility..' component.

The examples on Chip Pearson's excellent site should get you started.

森末i 2024-07-11 09:45:34

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

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

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

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

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

I'm not 100% sure how to do exactly what you have requested. But guessing the goal you have in mind there are a few possibilities.

1) Make part (or all) of your Globals a separate text file that is distributed with the .XLA I would use this for external references such as the version of the rest of your app. Write this at build time and distribute, and read on the load of the XLA.

2) I'm guessing your writing the version of the main component (ie: the non XLA part) of your application. If this is tru why store this in your XLA? Why not have the main part of the app allow certain version of the XLA to work. Version 1.1 of the main app could accept calls from Version 7.1 - 8.9 of the XLA.

3) If you are just looking to update the XLA so it gets included in your version control system or similar (i'm guessing here) maybe just touch the file so it looks like it changed.

If it's the version of the rest of the app that you are controlling i'd just stick it in a text file and distribute that along with the XLA.

疧_╮線 2024-07-11 09:45:34

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

An alternative way of handling versioning of an XLA file is to use a custom property in Document Properties. You can access and manipulate using COM as described here: http://support.microsoft.com/?kbid=224351.

Advantages of this are:

  • You can examine the version number without opening the XLA file

  • You don't need Excel on your build machine - only the DsoFile.dll component

Another alternative would be to store the version number (possibly other configuration data too) on a worksheet in the XLA file. The worksheet would not be visible to users of the XLA. One technique I have used in the past is to store the add-in as an XLS file in source control, then as part of the build process (e.g. in a Post-Build event) run the script below to convert it to an XLA in the output directory. This script could be easily extended to update a version number in a worksheet before saving. In my case I did this because my Excel Add-in used VSTO, and Visual Studio doesn't support XLA files directly.

'
'   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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文