Как ввести код VBA в Excel .xlsm без использования Interop? - PullRequest
6 голосов
/ 30 ноября 2011

Моя цель - добавить макросы в книгу Excel без необходимости включать «Доверительный доступ к объектному модулю проекта VBA» в Центре доверия Excel. (Включение доступа представляется угрозой безопасности).

Найдены случайные кусочки головоломки в моем начальном поиске по фактам: -Я вижу, что скрипт VBA хранится в ZIP-файле .xlsm в виде vbaProject.bin. Есть несколько бесплатных / коммерческих ресурсов, которые могут работать с файлами Excel: Создание Excel без взаимодействия и шаблона с или без строки и столбца

Было бы неплохо просто иметь файл сценария VBA в проекте C #, из которого код C # извлекает и вставляет в документ Excel без взаимодействия VBA. Какой-нибудь быстрый / быстрый / простой / простой способ сделать это или я должен поиграться с бесплатными / коммерческими ресурсами, указанными выше?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2011

Использование OpenXML SDK 2.0 :

  1. Создайте код макроса и сохраните его в формате .xlsm, скажем, snorehorse.xlsm.
  2. Откройте файл snorehorse.xlsmв OpenXML Productivity Toolkit и создайте код отражения в корне дерева.
  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));
    }

Я решил добавить DLL OpenXML SDK в локальную сборку проекта, чтобы завершитьпользователям не нужно устанавливать SDK самостоятельно.

Я думаю, что это можно сделать на более низком уровне, работая с XML, без использования OpenXML SDK, но я не пытался узнать, как это сделать.этот.Если кто-то может опубликовать код, я приму этот ответ поверх моего.

Кроме того, если у кого-то был программный способ преобразования сценария VBA во встроенном файле ресурсов в двоичную строку формата, ожидаемого Excel.можно было бы обойтись без необходимости копировать и вставлять новую строку двоичных данных каждый раз, когда вы хотите изменить код макроса.Это было бы лучшим ответом для меня.

Спасибо.

2 голосов
/ 28 октября 2015

Если вы используете EPPlus, теперь вы можете включать VBA программно. Смотрите здесь:

Написание и выполнение макросов VBA в Excel без использования Excel.Interop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...