如何注入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文档中,这将是很好的。有什么快速/快速/简单/直接的方法来做到这一点,或者我应该使用上面链接的免费/商业资源?
使用OpenXML SDK 2.0:
- 创建宏代码并将其保存为。xlsm格式,例如snorehorse.xlsm。
- snorehorse开放。在OpenXML生产力工具包中的xlsm,并在树的根上做一个反射代码。 查找宏的二进制代码。它是字符串格式,看起来像随机字符。
- 在您的IDE中,添加对OpenXML SDK的引用,并以编程方式创建或打开您想要注入宏代码的excel文件。
- 将步骤#3中找到的宏字符串复制到您的代码中。
- 添加新的vba部件到目标。
- 为新的vba部件提供字符串数据。
- 保存并运行,并很高兴您绕过了信任中心。
示例代码:
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。互操作