2012-03-14 88 views
3

我可以成功地将一块VBA代码注入到生成的Excel工作簿中,但我想要做的是使用Workbook_Open()事件,以便在打开文件时执行VBA代码。我将该sub添加到我的xlsm模板文件中的“ThisWorkbook”对象中。然后,我使用openxml生产力工具来反映代码并获取编码的VBA数据。OpenXML SDK将VBA注入到excel工作簿

生成文件并查看VBA时,会看到“ThisWorkbook”和“ThisWorkbook1”对象。我的VBA位于“ThisWorkbook”对象中,但代码从不打开。如果我将我的VBA代码移动到“ThisWorkbook1”并重新打开文件,它可以正常工作。为什么要创建一个额外的“ThisWorkbook”?是不可能注入一个Excel工作簿与Workbook_Open()子?这里是我正在使用的C#代码片段:

private string partData = "..."; //base 64 encoded data from reflection code 
//open workbook, myWorkbook 
VbaProjectPart newPart = myWorkbook.WorkbookPart.AddNewPart<VbaProjectPart>("rId1"); 
System.IO.Stream data = GetBinaryDataStream(partData); 
newPart.FeedData(data); 
data.Close(); 
//save and close workbook 

任何人有想法吗?

+0

在VBA编辑器中,当您右键单击ThisWorkbook和ThisWorkbook1时,是否将** Remove ThisWorkbook ... **选项变为灰色? – 2012-03-21 14:03:00

回答

3

基于我的研究,没有办法以您可以在C#中操作的格式插入项目零件数据。在OpenXML格式中,VBA项目仍以二进制格式存储。但是,将VbaProjectPart从一个Excel文档复制到另一个文档应该有效。因此,您必须事先确定您希望项目部分的内容。

如果你是这行,那么你可以将下面的代码添加到模板的Excel文件中的“的ThisWorkbook” Microsoft Excel对象,用适当的宏代码一起:

Private Sub Workbook_Open() 
    Run "Module1.SomeMacroName()" 
End Sub 

要复制VbaProjectPart从一个文件到另一个文件的对象,你会使用这样的代码:

public static void InsertVbaPart() 
{ 
    using(SpreadsheetDocument ssDoc = SpreadsheetDocument.Open("file1.xlsm", false)) 
    { 
     WorkbookPart wbPart = ssDoc.WorkbookPart; 
     MemoryStream ms; 
     CopyStream(ssDoc.WorkbookPart.VbaProjectPart.GetStream(), ms); 

     using(SpreadsheetDocument ssDoc2 = SpreadsheetDocument.Open("file2.xlsm", true)) 
     { 
      Stream stream = ssDoc2.WorkbookPart.VbaProjectPart.GetStream(); 
      ms.WriteTo(stream); 
     } 
    } 
} 

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[short.MaxValue + 1]; 
    while (true) 
    { 
     int read = input.Read(buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write(buffer, 0, read); 
    } 
} 

希望有所帮助。

+0

我还应该补充说,写完后我遇到了一个名为[ClosedXML](http://closedxml.codeplex.com/)的平台。它专为与OpenXML Excel文件交互而设计,非常直观,也可能有所帮助。 – Lentonator 2012-07-30 12:29:39

相关问题