Обнаружение и динамическая загрузка установленной библиотеки объектов Microsoft Word - PullRequest
0 голосов
/ 09 октября 2009

Небольшая предыстория : у меня есть небольшое приложение, которое будет использовать Word для создания подписи Outlook на основе шаблона Word и данных из активного каталога компании. Он отлично работает на компьютерах с Office 2007, поскольку я использовал «Библиотеку объектов Microsoft Word 12.0», когда кодировал ее на своем компьютере.

Хотя в сети довольно много компьютеров с Office 2003, на этих компьютерах отсутствует «Библиотека объектов Microsoft Word 12.0», что приводит к исключениям слева и справа.

Мой вопрос: : Как определить, какая версия Office установлена ​​и, следовательно, какая версия «Библиотеки объектов Microsoft Word» доступна, а затем загрузить ее. Я совершенно уверен, что используемые мной функции находятся как в «Библиотеке объектов Microsoft Word 12.0», так и в «Библиотеке объектов Microsoft Word 11.0».

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

class Signature
{
    public Dictionary<string, string> TemplateMappings { get; set;}
    public string SignatureTemplateFileName { get; set; }
    public string SignatureName { get; set;}
    public bool UseSignatureWithNewMessages { get; set; }
    public bool UseSignatureInReplyMessages { get; set; }

    public Signature()
    {
        UseSignatureWithNewMessages = true;
        UseSignatureInReplyMessages = true;
        TemplateMappings = new Dictionary<string, string>();
    }

    public void Create()
    {
        if(string.IsNullOrEmpty(SignatureTemplateFileName) || !File.Exists(SignatureTemplateFileName))
        {
            throw new InvalidOperationException("SignatureTemplateFileName is null or the file do not exists");
        }

        if(string.IsNullOrEmpty(SignatureName))
        {
            throw new InvalidOperationException("No SignatureName specified");
        }

        object nullObject = System.Reflection.Missing.Value;
        object signatureTemplate = SignatureTemplateFileName;

        // open word doc
        var word = new ApplicationClass();
        var doc = word.Documents.Add(ref signatureTemplate, ref nullObject, ref nullObject, ref nullObject);

        // search/replace user info
        object wdReplaceAll = WdReplace.wdReplaceAll;
        var find = word.Selection.Find;
        foreach (var pair in TemplateMappings)
        {
            find.Text = pair.Key;
            find.Forward = true;
            find.MatchCase = true;
            find.MatchWholeWord = true;
            find.Replacement.Text = pair.Value;
            find.Execute(ref nullObject /* FindText */,
                         ref nullObject /* MatchCase*/,
                         ref nullObject /* MatchWholeWord*/,
                         ref nullObject /* MatchWildcards*/,
                         ref nullObject /* MatchSoundsLike*/,
                         ref nullObject /* MatchAllWordForms*/,
                         ref nullObject /* Forward*/,
                         ref nullObject /* Wrap*/,
                         ref nullObject /* Format*/,
                         ref nullObject /* ReplaceWith*/,
                         ref wdReplaceAll /* Replace*/,
                         ref nullObject /* MatchKashida*/,
                         ref nullObject /* MatchDiacritics*/,
                         ref nullObject /* MatchAlefHamza*/,
                         ref nullObject /* MatchControl */);
        }

        // Add signature to outlook
        var signatureRange = doc.Range(ref nullObject, ref nullObject);
        word.EmailOptions.EmailSignature.EmailSignatureEntries.Add(SignatureName, signatureRange);

        // set new signature as default for news messages and replies
        if (UseSignatureWithNewMessages)
            word.EmailOptions.EmailSignature.NewMessageSignature = SignatureName;
        if (UseSignatureInReplyMessages)
            word.EmailOptions.EmailSignature.ReplyMessageSignature = SignatureName;

        // close and clean up
        doc.Saved = true;
        doc.Close(ref nullObject, ref nullObject, ref nullObject);
        word.Quit(ref nullObject, ref nullObject, ref nullObject);
    }
}

Любая помощь будет высоко ценится. Ввод кода выше также приветствуется; У меня нет опыта написания кода для библиотеки Office Interop, поэтому я уверен, что есть вещи, которые я могу сделать по-другому.

С наилучшими пожеланиями, Эгиль.

1 Ответ

1 голос
/ 09 октября 2009

ОК нашел то, что искал.

MS Office For Net устраняет головные боли базовых версий сборок взаимодействия Office. Возможно, вы можете использовать его непосредственно в своем проекте, иначе изучите его реализацию, чтобы понять, как решить эту проблему. Люди, работающие над этим проектом, вероятно, также являются отличным ресурсом, чтобы задавать вопросы о взаимодействии ...

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