Pregunta

Un poco de historia de fondo : Tengo pequeña aplicación que utilizar Word para generar una firma de Outlook basado en una plantilla de Word y los datos del directorio activo de la empresa. Funciona maravillosa en equipos con Office 2007, que no uso "de Microsoft Word 12.0 Object Library" cuando codificado en mi propio ordenador.

Hay un buen número de equipos de la red con Office 2003 sin embargo, y en esos equipos "Microsoft Word 12.0 Object Library" no se encuentra, lo que resulta en excepciones izquierdo y derecho.

Mi pregunta es: : ¿Cómo puedo detectar qué versión de Office está instalado y por lo tanto la versión de la "Biblioteca de objetos de Microsoft Word" está disponible, y posteriormente cargarlo. Estoy seguro de que la funcionalidad que estoy usando son tanto en el "Microsoft Word 12.0 Object Library" y el "Microsoft Word 11.0 Object Library".

En caso de que alguien está interesado, aquí está mi código actual utilizado para generar la firma:

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);
    }
}

Cualquier ayuda será muy apreciada. Entrada en el código anterior también es bienvenida; No tengo ninguna experiencia de codificación contra la biblioteca de la oficina de interoperabilidad, así que estoy seguro de que hay cosas que puedo hacer de manera diferente.

Saludos, Egil.

¿Fue útil?

Solución

Aceptar encontró lo que estaba buscando.

MS Office para Net abstrae los dolores de cabeza de las versiones ensamblado de interoperabilidad Oficina subyacentes. Tal vez se puede usar directamente en su proyecto, de lo que es estudiar la aplicación de entender la forma de abordar este problema. La gente que trabaja en ese proyecto son, probablemente, un gran recurso para hacer preguntas de interoperabilidad, así ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top