2011-11-30 35 views
5

我的目标是将宏添加到Excel工作簿,而无需在Excel信任中心启用“信任访问VBA项目对象模块”。 (启用访问似乎是一种安全风险)。如何在不使用Interop的情况下将VBA代码注入Excel .xlsm?

在我的初步实况调查中发现了随机拼图: - 我看到VBA脚本作为vbaProject.bin存储在压缩的.xlsm文件中。 - 有能与Excel文件的工作,一些免费/商业资源: Create excel without interop and template with or without row and columnspan

这将是很好,只是有在C#代码从拉并注入到Excel文档的C#项目中的VBA脚本文件没有VBA互操作。任何快速/快速/简单/直接的方式来做到这一点,或者我应该玩弄与上面链接的免费/商业资源?

回答

6

使用OpenXML SDK 2.0

  1. 创建宏代码并将其保存在.XLSM格式,说snorehorse.xlsm。
  2. 在OpenXML Productivity Toolkit中打开snorehorse.xlsm并在树根上执行反射代码。
  3. 找到宏的二进制代码。它是一个字符串格式,看起来像随机字符。
  4. 在您的IDE中,添加对OpenXML SDK的引用,并以编程方式创建或打开要将宏代码注入到的Excel文件。
  5. 将步骤#3中找到的宏字符串复制到您的代码中。
  6. 添加新的vba部件到目的地。
  7. 将字符串数据送入新的vba部分。
  8. 保存并运行,并高兴你绕过信任中心。

示例代码:

using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Spreadsheet; 

private string partData = "..."; 

    public void vbaInjector{  
     [code to create/open spreadsheet using OpenXML omitted] 
     VbaProjectPart vbaProjectPart1 = snoreSpreadsheetDoc.WorkbookPart.AddNewPart<VbaProjectPart>("rId8"); 
     System.IO.Stream data = GetBinaryDataStream(partData); 
     vbaProjectPart1.FeedData(data); 
     data.Close(); 
     [code to close spreadsheet and cleanup omitted] 
    } 


    private System.IO.Stream GetBinaryDataStream(string base64String) 
    { 
     return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String)); 
    } 

我选择的OpenXML的SDK DLL添加到项目的本地构建,以便最终用户将不必安装SDK本身。

我认为这可以在低层次上完成,使用XML,而不使用OpenXML SDK,但我没有试图学习如何做到这一点。如果任何人可以发布代码,我会接受我的答案。另外,如果有一种编程方式可以将嵌入式资源文件中的VBA脚本转换为excel预期格式的二进制字符串,则可以绕过每次都需要复制并粘贴一个新的二进制数据字符串的方法你想更改宏代码。这对我来说是一个很好的答案。

谢谢。

+0

它仍然有效吗?我会立即尝试这个。 –

+0

1个小时后,我仍然无法将任何代码注入到我的项目中而不会破坏它。只有当我执行OpenXML Toolkit反映的所有代码时才有效。 –

+0

在黑暗中拍摄......也许“rId8”已经被使用了?如何改变它像“rId888”? – Snorex

相关问题