办公室互操作无法在Windows服务工作(Office Interop Does Not Work

2019-07-04 00:36发布

我有与微软Office非常奇怪的问题。

我有一个公共库,其唯一目的就是打开任何Word文档的文件类型传递给它(一个完整的文件路径...)并保存打开的Word文档另存为PDF文件。

怪异的问题是,如果我使用来自一个窗口服务,当它试图打开word文档库,我得到一个空...又名,在Word文档从来没有得到开放。

然而,如果我从一个WPF或Windows窗体应用程序消耗的图书馆中,我从来没有任何问题。 据我所知,有与线程(单线程公寓)的问题,但是我不知道如何解决它的工作窗外的服务。 :( :( :(

我将不胜感激任何帮助! 我得到的错误是以下几点:

异常消息:{“对象引用不设置为一个对象的一个​​实例。”}(参照word文档)。 内部异常:空; HRESULT:-2147467261。 数据:ListDictionaryInternal 0条目; 堆栈跟踪:在DocumentConverter.ToPdf(字符串currentWorkingFolderPath,字符串pathToDocumentToConvert)在C:\项目文件... \ DocumentConverter.cs:209线

因此,这里是库函数。 它需要的Microsoft Office参考,这是由Visual Studio工具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;
}

Answer 1:

每@Sameer■在他的岗位: 在Office 2003的互操作支持Windows Server 2008上..?

正式的Microsoft Office 2003互操作不支持通过Microsoft Windows Server 2008上。

但很多排列组合和使用的代码和搜索之后,我们遇到了一个解决方案,适用于我们的场景。

解决的办法是插入Windows 2003和2008年保持其文件夹结构的方式之间的区别,因为Office互操作依赖于文件打开桌面文件夹/保存中间。 2003年系统安置在systemprofile这是继2008年缺席桌面文件夹。

所以,当我们各自的层次结构下于2008年创建该文件夹,如下所示; 办公室互操作是能够将文件保存为必需的。 该桌面文件夹,需要下设立

C:\ WINDOWS \ system32 \设置\ systemprofile

C:\ WINDOWS \ Syswow64资料\设置\ systemprofile

多谢你们..!



Answer 2:

办公室互操作不是由MS服务器般的场景(如ASP.NET或Windows服务或类似) 的支持 -见http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2 !

您将需要使用一些库来实现你想要的:

  • MS提供的OpenXML SDK 2.0版 (免费)
  • 使用Aspose.Words (商业)


Answer 3:

一旦已创建这些文件夹:

C:\ WINDOWS \ system32 \设置\ systemprofile \桌面C:\ WINDOWS \ Syswow64资料\ CONFIG \ systemprofile \桌面

确保计划任务与对这些文件夹具有配置文件访问运行。



Answer 4:

是您的Windows服务已在“在交互模式下运行”选项启用? 它可能会失败,因为Word正在试图显示一个UI,这对于这似乎显而易见的原因,它不能做。

另一种可能性(和一个很常见的问题,人)是您的Windows服务是没有权限来访问你试图传递给它的文件/文件夹的帐户下运行。 相比之下一个WPF /的WinForms程序可根据用户的凭据运行。

如果这是没有问题的,有没有被抛出任何错误? 检查Windows事件日志和/或添加一些记录,看看是否有一些错误被默默地抛出。

编辑:我通过MSDN机制的文档扫了一眼( 用于Word互操作 ),它不会出现使用VSTO是必需的。 你可以尝试互操作做到这一点使用纯文字,看看它是否起作用? 这篇文章有一个例子



Answer 5:

我ASP.net 2.0办公自动化应用程序在Windows 2008运行良好服务器64位遵循以下链接指令之后。 希望它可以帮助大家。

http://emalvass.blogspot.com/2010/01/how-to-use-office-2007-automation-in.html

下面我的示例程序:

Imports Microsoft.Office.Interop.Word


Dim Result As Boolean = False

    Dim appWord As New Microsoft.Office.Interop.Word.Application
    Dim wordDocument As Microsoft.Office.Interop.Word.Document

    Try
        Dim oFile As New FileInfo(sPDFFile), sFilePath As String, sFileName As String, sFileNameArr() As String
        Dim sActualFileName As String

        sFileName = oFile.Name
        sFileNameArr = sFileName.Split(".")
        sActualFileName = sFileNameArr(0)
        sFilePath = oFile.DirectoryName & "\" & sActualFileName & ".pdf"

        wordDocument = appWord.Documents.Open(sPDFFile)

        wordDocument.ExportAsFixedFormat(sFilePath, WdExportFormat.wdExportFormatPDF)
        'wordDocument.ExportAsFixedFormat(sFilePath, 17)

        Result = True
        oFile = Nothing

    Catch ex As COMException
        sErrMsg = ex.InnerException.ToString
        Result = False
    Finally
        wordDocument.Close()
        wordDocument = Nothing
        appWord.Application.Quit()
        appWord = Nothing



    End Try


    Return Result


文章来源: Office Interop Does Not Work in Windows Service