Word Automation: не удалось открыть хранилище макросов - PullRequest
3 голосов
/ 07 марта 2012

Мое приложение (приложение Windows vb.net, развернутое через ClickOnce) использует Word для открытия и заполнения шаблонов .dot для создания новых документов Word.Я ссылаюсь на библиотеку объектов Microsoft Word 14 и использую этот код:

Dim oWord As Word.Application = Nothing
Dim oDoc As Word.Document = Nothing
Try
    oWord = New Word.Application
    Dim strFileName As String = ""
    Select Case strType
        Case "LettreReception"
            strFileName = Path.Combine(GetParam(1), "Template_LettreReception.dot")
            If File.Exists(strFileName) Then
                oDoc = oWord.Documents.Add(strFileName)

В последней строке я получаю сообщение об ошибке « не удалось открыть хранилище макросов » на развернутых машинах (не на моей машине разработки)).

Я разрабатываю с Windows 7 - Office 2010 - VS 2010 (.Net 3.5).Моя машина развертывания - также Windows 7 с установленным Office 2010.

Я попытался удалить normal.dotm (я нашел некоторые ссылки, рекомендующие это), но безуспешно.Используемый шаблон .dot не содержит макросов.

Ответы [ 3 ]

3 голосов
/ 14 января 2014

Проверьте свойства документа word и убедитесь, что файлы разблокированы. Иногда, когда вы получаете документы с другого компьютера или загружаете их из Интернета, они блокируются, что приводит к возникновению этого исключения "не удалось открыть хранилище макросов"

3 голосов
/ 02 мая 2012

Поскольку Word Interop фактически работает за кулисами, как если бы он работал в интерактивном сеансе, требуются определенные разрешения для учетной записи, используемой во время выполнения.

Используете ли вы аутентификацию и олицетворение Windows в своем веб-приложении?Если это так, то пользователь, выдающий себя за него, должен иметь права локального входа в систему на сервере для запуска Word ... Кроме того, необходимо фактически войти на сервер с этой учетной записью хотя бы один раз, чтобы на этом компьютере для этого пользователя существовал профиль.поэтому куст реестра можно загрузить.Я также обнаружил, что вам может потребоваться запустить Word хотя бы один раз от имени этого пользователя (чтобы убедиться, что все сообщения об инициализации впервые обрабатываются, прежде чем запускать Word из кода).

Если нетзатем служебная учетная запись, под которой работает приложение (обычно NETWORK SERVICE), требует вышеупомянутых разрешений (которые я опишу в ближайшее время), и вам придется делать что-то необычное, например динамическую загрузку куста реестра во время выполнения.Лично я предпочитаю реализовать временную олицетворение в коде с учетной записью пользователя, имеющей локальные разрешения на вход в систему на рассматриваемом сервере.

Локальный вход в систему может быть немного сложным в зависимости от конфигурации вашей сети и групповой политики(если вы хотите быть в некоторой степени безопасным, а не просто использовать учетную запись администратора домена).

Причина, по которой все работает на вашем компьютере, работающем в VS, заключается в том, что контекст веб-приложения - это ВАША учетная запись пользователя - которая, изКонечно, имеет локальные разрешения на вход в систему на вашем компьютере с кустом реестра, который можно загрузить.

Теперь для разрешений:

  • Сначала вы должны запустить "dcomcnfg"на сервере и внесите следующее изменение конфигурации:

    • Щелкните правой кнопкой мыши Службы компонентов \ Компьютеры \ Мой компьютер \ Конфигурация DCOM \ Документ Microsoft Word 97 - 2003 и выберите Свойства
    • Вна экране «Свойства» перейдите на вкладку «Безопасность» и измените «Разрешения на запуск и активацию» на «Касто»mize.
    • Нажмите кнопку «Редактировать» и добавьте учетную запись NETWORK SERVICE на локальном компьютере (если не используете олицетворение ... Если используете олицетворение, добавьте соответствующего пользователя или группу) в список пользователей и установите флажок «Локальный запуск»и «Локальная активация»
  • Убедитесь, что учетная запись NETWORK SERVICE локального компьютера (если не используется олицетворение ... Если используется олицетворение, то соответствующий пользователь или группа) имеет соответствующиеразрешения на чтение / изменение папок и файлов, которые вы будете открывать и / или сохранять в.

  • Создайте каталог «Рабочий стол» в папке: C: \ Windows\ System32 \ config \ systemprofile \ и предоставьте полные разрешения локальной учетной записи NETWORK SERVICE (или учетной записи, под которой работает ваше приложение ASP .NET) [ПРИМЕЧАНИЕ. Я полагаю, что этот и следующий шаг применяются, только если НЕ используется олицетворение]

  • Предоставить разрешения на изменение / чтение / выполнение для папки C: \ Windows \ System32 \ config \ systemprofile

Надеюсь, чтоНекоторым это помогает и не слишком смущает ...

0 голосов
/ 14 января 2014

«не удалось открыть хранилище макросов» говорит вам, что VBA ищет определенный файл структурированного хранилища, например .DOT или .DOC, и ищет хранилище (вид потока внутрифайл) в этом файле, который содержит код VBA.Если он не может открыть его, возможны следующие причины:

  • контейнер (.doc / .dot) не существует
  • контейнер не может быть открыт с разрешениями вызывающей стороны
  • контейнер есть, а хранилища нет (например, в целевой системе есть контейнер с ожидаемым именем, но он не содержит макросов)
  • контейнер есть ихранилище есть, но не может быть открыто с разрешениями вызывающего абонента

Так что одну вещь нужно сделать, чтобы просмотреть ваш проект в поисках всего, на что он ссылается (возможно, даже других объектов или DLL, которые вы указали через Tools->Ссылки), которая также не поставляется с вашим шаблоном.

...