Использование OpenXML SDK 2.0 :
- Создайте код макроса и сохраните его в формате .xlsm, скажем, snorehorse.xlsm.
- Откройте файл snorehorse.xlsmв OpenXML Productivity Toolkit и создайте код отражения в корне дерева.
- Найдите двоичный код макроса.Он имеет строковый формат и выглядит как случайные символы.
- В вашей среде 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));
}
Я решил добавить DLL OpenXML SDK в локальную сборку проекта, чтобы завершитьпользователям не нужно устанавливать SDK самостоятельно.
Я думаю, что это можно сделать на более низком уровне, работая с XML, без использования OpenXML SDK, но я не пытался узнать, как это сделать.этот.Если кто-то может опубликовать код, я приму этот ответ поверх моего.
Кроме того, если у кого-то был программный способ преобразования сценария VBA во встроенном файле ресурсов в двоичную строку формата, ожидаемого Excel.можно было бы обойтись без необходимости копировать и вставлять новую строку двоичных данных каждый раз, когда вы хотите изменить код макроса.Это было бы лучшим ответом для меня.
Спасибо.