使用MSBuild更改.xla文件

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

  1. 用Excel打开XLA文档。
  2. 切换到VBEditor模式。 (ALT + F11)
  3. 打开VBProject,input密码。
  4. 打开modGlobal文件。
  5. 将variables的默认值更改为当前date。
  6. closures并保存项目。

我不知道如何自动化这个过程。 最好的我可以想出一个Excelmacros或自动IT脚本。 我也可以写一个自定义的MSBuild任务,但这可能会变得棘手。 其他人有没有其他build议?

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

这个的好处是:

  • 您可以在不打开XLA文件的情况下检查版本号

  • 您不需要生成计算机上的Excel – 只有DsoFile.dll组件

另一种方法是在XLA文件的工作表上存储版本号(可能还有其他configuration数据)。 XLA的用户不能看到该工作表。 我以前使用过的一种技术是将加载项作为XLS文件存储在源代码控制中,然后作为构build过程的一部分(例如,在构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 

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

1)使您的Globals的一部分(或全部)成为与.XLA一起分发的单独的文本文件。我将使用它作为外部参考(如应用程序其余部分的版本)。 在编译的时候写下来,分发,并读取XLA的负载。

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

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

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

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

芯片皮尔逊的优秀网站上的例子应该让你开始。