Question

Une petite histoire de retour : J'ai petite application qui utilisera Word pour générer une signature d'Outlook basé sur un modèle Word et les données de l'entreprise Active Directory. Il fonctionne sur les ordinateurs merveilleux avec Office 2007, puisque je « Microsoft Word 12.0 Object Library » quand je codé sur mon ordinateur.

Il y a un certain nombre d'ordinateurs sur le réseau avec Office 2003 cependant, et sur ces ordinateurs « Microsoft Word 12.0 Object Library » est manquante, ce qui entraîne des exceptions à gauche et à droite.

Ma question est : Comment puis-je détecter la version d'Office est installé et donc la version de la « Microsoft Word Object Library » est disponible, puis le charger. Je suis tout à fait sûr que la fonctionnalité que je utilise sont dans la « Microsoft Word 12.0 Object Library » et le « Microsoft Word 11.0 Object Library ».

Dans le cas où quelqu'un est intéressé, voici mon code actuel utilisé pour générer la signature:

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

Toute aide sera très appréciée. Entrée sur le code ci-dessus est également la bienvenue; Je n'ai aucune expérience de codage contre bibliothèque de l'Office Interop, donc je suis sûr qu'il ya des choses que je peux faire différemment.

Cordialement, Egil.

Était-ce utile?

La solution

OK trouvé ce que je cherchais.

MS Office Net fait abstraction des maux de tête des versions d'assemblage Interop de bureau sous-jacent. Peut-être que vous pouvez l'utiliser directement dans votre projet, étudier sinon il est la mise en œuvre de comprendre comment résoudre ce problème. Les gens qui travaillent sur ce projet sont probablement une excellente ressource pour poser des questions Interop ainsi ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top