Открытие документа Microsoft Word в службе Windows кажется зависшим - PullRequest
8 голосов
/ 04 августа 2010

У меня есть служба Windows, написанная на C #, которая читает текст из документов Word (DOC и DOCX), используя VBA Interop.Однако, на некоторых документах, кажется, зависает вызов метода Open.Кажется, что во всех проблемных документах есть макросы.Локально установленная версия word отключила макросы, и код, который я использую для открытия документа, выглядит следующим образом:

using Word = Microsoft.Office.Interop.Word;
using OfficeCore = Microsoft.Office.Core;

Word.Application m_wordApp = new Word.ApplicationClass();
Word.Document m_wordDoc = null;

object TRUE_VALUE = true;
object FALSE_VALUE = false;
object MISSING_VALUE = System.Reflection.Missing.Value;

m_wordApp.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone; //will still fail with this line removed
m_wordApp.Visible = false; //will still fail with this line removed
m_wordApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; //will still fail with this line removed
m_wordDoc = m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE);

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

Ответы [ 5 ]

5 голосов
/ 04 августа 2010

Microsoft.Office.Interop.Word использует оболочку COM для удаленного управления самим исполняемым файлом Word.Это абсолютно ужасно.Параметр отключения макросов в используемой копии Word почти наверняка зависит от пользователя, и служба Windows будет работать под управлением Word под любой учетной записью, под которой работает служба.Скорее всего, это, по сути, всплывает какой-то диалог безопасности макросов в некоем теоретическом мире, то есть рабочем столе пользователей службы Windows / ui.

4 голосов
/ 06 сентября 2010

Надеюсь, я наконец-то нашел все проблемы, связанные с этим, и получил следующую строку для открытия документа:

m_wordApp.Documents.Open(ref fileNameObject, ref FALSE_VALUE, ref TRUE_VALUE, ref FALSE_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref MISSING_VALUE, ref FALSE_VALUE, ref TRUE_VALUE, ref MISSING_VALUE, ref TRUE_VALUE, ref MISSING_VALUE);

4-й и 2-й последние параметры не позволяют открывать диалоги восстановления и кодированиякоторый исправил большинство ошибок.

Ключ реестра для отключения и отключения макросов без уведомления:

[HKEY_USERS\S-x-x-xx-xxxxxxxxxx-xxxxxxxxx-xxxxxxxxxx-xxx\Software\Microsoft\Office\12.0\Word\Security]
"VBAWarnings"=dword:00000004

Наконец, после всего этого все еще были документы, которые приводили к сбою службы и утечке winwordэкземпляров.После входа в систему в качестве пользователя службы и открытия одного из этих документов я получил это сообщение из слова: «Word не может запустить конвертер mswrd632».Это исправлено удалением раздела реестра, как описано в http://support.microsoft.com/kb/973904.

Редактировать: я также обнаружил, что, поскольку VBA не был установлен, Word открыл диалоговое окно, чтобы сообщить службе об этом, что привело к тому, что некоторые документыповесить службу.Переустановка, а затем отключение, хотя сам Word (как описано выше) получил еще несколько документов обработки.Еще несколько документов, которые не могут быть обработаны.Подумайте о попытке http://poi.apache.org/text-extraction.html с ikvmc для анализа документов.

2 голосов
/ 08 октября 2010

Вы можете также попытаться вызвать метод documents.OpenNoRepairDialog (...). Он существует для офиса 2007 и позже.

Обратите внимание, что я использую прямые COM-вызовы, поэтому я не уверен, что он существует в библиотеках взаимодействия офиса.

2 голосов
/ 04 августа 2010

Word предложит пользователю, когда возникнут незначительные проблемы с документом.Это приглашение будет отображаться на рабочем столе для служб в вашем случае, когда никто не слышит его крик.И предотвращение завершения вызова метода Open ().

Убедитесь, что для аргумента OpenAndRepair метода Open () установлено значение True, так что это происходит автоматически без запроса пользователя.

2 голосов
/ 04 августа 2010

Существуют рекомендации против автоматизации на стороне сервера от Microsoft, но есть также много ресурсов, которые помогут вам, если вы все еще собираетесь это делать. Эти две статьи должны дать вам достаточное представление о том, что нужно учитывать:

Однако, если это так просто, как ваши документы зависают из-за каких-либо AutoMacros, таких как AutoOpen, внутри кода VBA позади, вам нужно использовать WordBasic, чтобы отключить их. Я никогда не мог заставить это работать в C #, но я сделал в VB.NET. См. Как открыть документ, содержащий макрос AutoOpen, с помощью PowerShell?

Последний вариант - рассмотреть инструмент, созданный для автоматизации Office на стороне сервера, например Apose.Words .

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