Frage

Ein wenig Geschichte zurück : Ich kleine Anwendung, die Word eine Outlook-Signatur basiert auf einer Word-Vorlage und Daten von der Firma Active Directory zu erzeugen. Es funktioniert wunderbar auf Computern mit Office 2007, da ich „Microsoft Word 12.0 Object Library“ verwendet, wenn ich es auf meinem eigenen Computer codiert.

Es gibt durchaus ein paar Computer im Netzwerk mit Office 2003 aber, und auf diesen Computern „Microsoft Word 12.0 Object Library“ fehlt, was Ausnahmen links und rechts.

Meine Frage ist, : Wie erkenne ich, welche Version von Office installiert ist und somit, welche Version des „Microsoft Word Object Library“ zur Verfügung steht, und es anschließend laden. Ich bin ziemlich sicher, dass die Funktionalität ich verwende sind sowohl in der "Microsoft Word 12.0 Object Library" und dem "Microsoft Word 11.0 Object Library".

Falls jemand interessiert ist, hier ist mein aktueller Code verwendet, um die Signatur zu erzeugen:

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

Jede Hilfe wird sehr geschätzt. Eingang auf dem Code oben ist auch willkommen; Ich habe keine Erfahrung Codierung gegen Office-Interop-Bibliothek, so dass ich bin sicher, es gibt Dinge, die ich anders machen kann.

Mit freundlichen Grüßen, Egil.

War es hilfreich?

Lösung

OK gefunden, was ich suchte.

MS Office Für Net abstrahiert die Kopfschmerzen der Montage Versionen Interop zugrunde liegenden Büro. Vielleicht können Sie es direkt in Ihrem Projekt verwenden, sonst es Implementierung studieren zu verstehen, wie dieses Problem zu beheben. Die Leute an diesem Projekt arbeiten, sind wahrscheinlich eine große Ressource Fragen zu stellen Interop auch ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top