Обнаружение и динамическая загрузка установленной библиотеки объектов Microsoft Word
-
20-09-2019 - |
Вопрос
Небольшая предыстория:У меня есть небольшое приложение, которое будет использовать Word для генерации подписи Outlook на основе шаблона Word и данных из компании active directory.Это прекрасно работает на компьютерах с 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 library, поэтому я уверен, что есть вещи, которые я могу сделать по-другому.
С наилучшими пожеланиями, Эгил.
Решение
ОК нашел то, что искал.
MS Office Для Net устраняет головные боли, связанные с базовыми версиями сборки Office interop assembly.Возможно, вы сможете использовать его непосредственно в своем проекте, в противном случае изучите его реализацию, чтобы понять, как решить эту проблему.Люди, работающие над этим проектом, вероятно, также являются отличным ресурсом для того, чтобы задавать вопросы о взаимодействии..