0

ちょっとした裏話: Word を使用して、Word テンプレートと会社の Active Directory のデータに基づいて Outlook 署名を生成する小さなアプリケーションがあります。自分のコンピューターでコーディングしたときに「Microsoft Word 12.0 Object Library」を使用したため、Office 2007 を搭載したコンピューターでうまく機能します。

ただし、ネットワーク上には Office 2003 を使用するコンピューターがかなりの数あり、それらのコンピューターでは「Microsoft Word 12.0 Object Library」が見つからないため、左右に例外が発生します。

私の質問は次のとおりです。どのバージョンの Office がインストールされているか、つまりどのバージョンの "Microsoft Word Object Library" が利用可能かを検出し、その後それをロードするにはどうすればよいですか。私が使用している機能は、"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 ライブラリに対してコーディングした経験がないので、別の方法でできることがあると確信しています。

よろしく、エギル。

4

1 に答える 1

1

OK、探していたものを見つけました。

MS Office For Netは、基礎となる Office 相互運用アセンブリ バージョンの頭痛の種を抽象化します。おそらく、プロジェクトで直接使用できますが、それ以外の場合は、実装を調べて、この問題に対処する方法を理解してください。そのプロジェクトに取り組んでいる人々は、おそらく相互運用に関する質問をするための優れたリソースです..

于 2009-10-08T21:16:39.583 に答える