5

Microsoft Office で非常に奇妙な問題が発生しています。

私は共通のライブラリを持っています。その唯一の目的は、渡されたWordドキュメントのファイルタイプを(完全なファイルパスで...)開き、その開いたWordドキュメントをpdfファイルとして保存することです。

奇妙な問題は、Windows サービスからそのライブラリを使用すると、Word 文書を開こうとするたびに null が返されることです...別名、Word 文書が開かれませんでした。

ただし、WPF または Windows フォーム アプリケーションからライブラリを使用する場合、問題はありません。スレッド (シングル スレッド アパートメント) に問題があることは承知していますが、Windows サービスから問題を解決する方法がわかりません。:( :( :(

助けていただければ幸いです!私が得るエラーは次のとおりです。

例外メッセージ: {"オブジェクト参照がオブジェクトのインスタンスに設定されていません。"} (Word ドキュメントを参照)。内部例外: Null; HResult: -2147467261. データ: エントリが 0 の ListDictionaryInternal。スタック トレース: c:\Project Files...\DocumentConverter.cs:line 209 の DocumentConverter.ToPdf(String currentWorkingFolderPath, String pathToDocumentToConvert) で

これがライブラリ関数です。Visual Studio Tools for Office によって作成される Microsoft Office 参照が必要です。

private string ToPDF(string currentWorkingFolderPath, string pathToDocumentToConvert)
{
    string temporaryPdfFolderPath = Path.GetFullPath(currentWorkingFolderPath + "\\pdf\\");
    string temporaryPdfFilePath = Path.GetFullPath(temporaryPdfFolderPath + "\\pdffile.pdf");

    if (!FileSystem.CreateDirectory(temporaryPdfFolderPath))
    {
        return null;
    }

    try
    {
        Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application();

        object objectMissing = System.Reflection.Missing.Value;

        wordApplication.Visible = false;
        wordApplication.ScreenUpdating = false;

        FileInfo wordFile = new FileInfo(pathToDocumentToConvert);

        Object fileName = (Object)wordFile.FullName;

        // This is where it breaks when called from windows service. Use the dummy value as a placeholder for optional arguments
        Document wordDocument = wordApplication.Documents.Open(ref fileName, ref objectMissing,            
            true, ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,            
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,            
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing);



        object outputFileName = (object)temporaryPdfFilePath;
        object fileFormat = WdSaveFormat.wdFormatPDF ;

        // Save document into PDF Format
        wordDocument.SaveAs(ref outputFileName,
            ref fileFormat, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing,
            ref objectMissing, ref objectMissing, ref objectMissing, ref objectMissing);

        // Close the Word document, but leave the Word application open.
        // doc has to be cast to type _Document so that it will find the
        // correct Close method.                
        object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
        ((_Document)wordDocument).Close(ref saveChanges, ref objectMissing, ref objectMissing);

        wordDocument = null;

        // word has to be cast to type _Application so that it will find
        // the correct Quit method.
        ((Microsoft.Office.Interop.Word._Application)wordApplication).Quit(ref objectMissing, ref objectMissing, ref objectMissing);

        wordApplication = null;

    }
    catch (Exception ex)
    {
        //logging code
        return null;
    }

    return temporaryPdfFilePath;
}
4

5 に答える 5

26

@Sameer S の投稿によると、Office 2003 の相互運用性は Windows Server 2008 でサポートされていますか ..?

正式には、Microsoft Office 2003 Interop は、Microsoft によって Windows Server 2008 でサポートされていません。

しかし、コードと検索を使用して多くの順列と組み合わせを行った後、シナリオに適した 1 つのソリューションに出会いました。

解決策は、Windows 2003 と 2008 のフォルダー構造の維持方法の違いを埋めることです。これは、Office 相互運用機能がデスクトップ フォルダーに依存してファイルを開いたり保存したりするためです。2003 システムでは、2008 には存在しない systemprofile の下にデスクトップ フォルダが格納されています。

したがって、以下に示すように、2008 年にそれぞれの階層の下にこのフォルダーを作成すると、Office Interop は、必要に応じてファイルを保存できます。このデスクトップ フォルダは、次の場所に作成する必要があります。

C:\Windows\System32\config\systemprofile

C:\Windows\SysWOW64\config\systemprofile

みんなありがとう..!

于 2012-11-21T16:23:08.763 に答える
6

これらのフォルダが作成されたら:

C:\Windows\System32\config\systemprofile\Desktop C:\Windows\SysWOW64\config\systemprofile\Desktop

これらのフォルダにアクセスできるプロファイルを使用して、スケジュール タスクが実行されていることを確認してください。

于 2016-10-05T11:28:24.447 に答える
4

Office Interop は、サーバーのようなシナリオ (ASP.NET や Windows サービスなど) では MS によってサポートされていません- http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2を参照!

目的を達成するには、いくつかのライブラリを使用する必要があります。

于 2012-11-20T19:04:04.037 に答える
1

Windows サービスで「インタラクティブ モードで実行」オプションが有効になっていますか? Word が UI を表示しようとしているために失敗している可能性がありますが、明らかな理由により表示できません。

もう 1 つの可能性 (および非常に一般的な問題) は、Windows サービスが、渡そうとするファイル/フォルダーへのアクセス許可を持たないアカウントで実行されていることです。対照的に、WPF/Winforms プログラムはユーザーの資格情報の下で実行されます。

それが問題でない場合、スローされるエラーはありますか? Windows イベント ログを確認するか、何らかのログを追加して、エラーがサイレントにスローされているかどうかを確認します。

編集: MSDN のドキュメント ( Word Interop の場合) を一瞥したところ、VSTO を使用する必要があるようには見えません。純粋な相互運用機能を使用してこれを実行し、それが機能するかどうかを確認できますか? この投稿には例があります

于 2012-11-20T17:59:35.757 に答える