문제

약간의 뒷이야기: Word 템플릿과 회사 Active Directory의 데이터를 기반으로 Outlook 서명을 생성하기 위해 Word를 사용하는 작은 응용 프로그램이 있습니다. 내 컴퓨터에서 코딩 할 때 "Microsoft Word 12.0 객체 라이브러리"를 사용했기 때문에 Office 2007이있는 컴퓨터에서 훌륭하게 작동합니다.

그러나 Office 2003이있는 네트워크에는 몇 개의 컴퓨터가 있으며, 해당 컴퓨터에는 "Microsoft Word 12.0 객체 라이브러리"가 누락되어 왼쪽과 오른쪽의 예외가 발생합니다.

내 질문은: 어떤 버전의 Office가 설치되었는지, 따라서 "Microsoft Word Object 라이브러리"버전을 사용할 수있는 방법을 어떻게 감지하고 이후로드하십시오. 내가 사용하는 기능은 "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 라이브러리에 대한 코딩 경험이 없으므로 다르게 할 수있는 일이 있다고 확신합니다.

안부에, 에일.

도움이 되었습니까?

해결책

좋아, 내가 찾고있는 것을 찾았습니다.

인터넷을위한 MS 사무소 기본 Office Interop Assembly 버전의 두통을 추상화합니다. 아마도 프로젝트에서 직접 사용할 수 있습니다. 그렇지 않으면이 문제를 해결하는 방법을 이해하기 위해 구현을 연구합니다. 그 프로젝트를 수행하는 사람들은 아마도 인터 로프 질문을 할 수있는 훌륭한 자료 일 것입니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top