使用OpenXML SDK 2.0:
- 创建宏代码并将其保存在.XLSM格式,说snorehorse.xlsm。
- 在OpenXML Productivity Toolkit中打开snorehorse.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预期格式的二进制字符串,则可以绕过每次都需要复制并粘贴一个新的二进制数据字符串的方法你想更改宏代码。这对我来说是一个很好的答案。
谢谢。
它仍然有效吗?我会立即尝试这个。 –
1个小时后,我仍然无法将任何代码注入到我的项目中而不会破坏它。只有当我执行OpenXML Toolkit反映的所有代码时才有效。 –
在黑暗中拍摄......也许“rId8”已经被使用了?如何改变它像“rId888”? – Snorex