簡體   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