如何注入VBA代码到Excel .xlsm不使用互操作

本文关键字:xlsm Excel 互操作 代码 何注入 注入 VBA | 更新日期: 2023-09-27 18:16:29

我的目标是将宏添加到excel工作簿中,而无需在excel信任中心启用"对VBA项目对象模块的信任访问"。(启用访问似乎有安全风险)。

在我最初的事实查找搜索中发现随机拼图:-I看到VBA脚本存储在压缩的。xlsm文件中,名为vbaProject.bin。-有几个免费/商业资源,可以与excel文件工作:创建不带互操作和模板的excel

在c#项目中简单地拥有一个VBA脚本文件,c#代码从中提取并注入到没有VBA互操作的Excel文档中,这将是很好的。有什么快速/快速/简单/直接的方法来做到这一点,或者我应该使用上面链接的免费/商业资源?

如何注入VBA代码到Excel .xlsm不使用互操作

使用OpenXML SDK 2.0:

  1. 创建宏代码并将其保存为。xlsm格式,例如snorehorse.xlsm。
  2. snorehorse开放。在OpenXML生产力工具包中的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期望的格式的二进制字符串,一个可以绕过必须复制和粘贴在一个新的字符串的二进制数据,每次你想改变宏代码。那将是一个比我的更好的答案。

谢谢。

如果您使用EPPlus,您现在可以通过编程方式包含VBA。在这里看到的:

在Excel上编写和执行VBA宏而不使用Excel。互操作