繁体   English   中英

服务器上MS Office的远程自动化

[英]Remoting Automation of MS Office on the server

我警告您,对于许多人来说,他的问题似乎很奇怪:)但是我必须发布该问题,因为我的项目经理认为我存在技术解决方案,即使对我而言也不存在。

我们有什么:

  • Windows 7控制台应用程序,没有UI,运行我们的C#应用​​程序,并且没有Office和Interop
  • Windows 2012服务器,上面装有Ms Office 2010 + Interop(当然还有IIS和.NET)

我的总理想要什么(我告诉他这是不可能的):

  • 从我的C#客户端应用程序
  • 自动化服务器上​​安装的“ Ms office”
  • 自动化意味着将文档文件“保存”或“打印”到网络打印机。
  • 当然,女士办公室流程必须在服务器上运行

对我来说,这种“可以实现Office远程女士自动化”的解决方案似乎是不可能的。 但是也许我错了,可以使用DCOM,WCF或其他东西吗?

任何人都可以确认我是对的;)

正如您已经从注释中了解到的那样,由于某些原因,自动化任何Office应用程序的桌面版本都是很糟糕的。 有关详细信息,请参见知识库文章KB257757 Office的服务器端自动化注意事项 该文章的主要内容是:

Microsoft当前不建议也不支持任何无人参与的非交互客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT Services)中的Microsoft Office应用程序自动化,因为Office可能表现出不稳定的行为和/在此环境中运行Office时出现死锁或死锁。

但是,正如您仍然坚持认为的那样,请考虑以下示例,这是一个非常简单,幼稚的示例,不能在生产概念验证时使用,它使您可以快速解决知识库文章中提到的所有问题。

在全新的解决方案中,创建WCF服务应用程序和控制台应用程序。 在WCF应用程序中,添加以下接口:

[ServiceContract]
public interface IPrintService
{
    [OperationContract]
    string Print(Stream wordDoc);
}

并有一个服务来实现。 确保添加对Microsoft.Office.Interop.Word的引用,您可以在“添加引用”对话框的“ COM”选项卡中找到该引用。

public class PrintService : IPrintService
{
    public string Print(Stream wordDocStream)
    {
        // copy our stream to a local file
        var tempFile = Path.GetTempFileName();
        using(var file = File.Create(tempFile))
        {
            wordDocStream.CopyTo(file);
        }

        // start word
        var wordApp = new Microsoft.Office.Interop.Word.Application();
        // setup printer
        wordApp.ActivePrinter = "Canon LBP3010/LBP3018/LBP3050";
        // open, collect data, print and close
        var doc = wordApp.Documents.Open(tempFile);
        doc.PrintOut();
        var res = doc.Words.Count;
        doc.Close(false);

        // quit word
        wordApp.Quit(false);
        // delete temp file
        File.Delete(tempFile);
        return String.Format("{0} words", res);
    }
}

您可以在此处看到一个准系统解决方案,用于打印作为流发送到服务的文档。 该服务将流复制到文件,启动Word,打开文件,打印文档,从文档中获取一些数据,然后拆解并清理干净。

客户很直接:

using(var client = new PrintService.PrintServiceClient())
{
    using(var file = File.Open(@"small.docx", FileMode.Open))
    {
        var response = client.Print(file);
        Console.WriteLine(response);
    }
}

从技术上讲,这就是从服务中打印Word文档所需要的全部。 这在开发服务器上运行没有很多问题。 如果您在IIS上运行此程序,则可能必须确保在AppPool中用作标识的帐户是可以启动Word的“用户”,允许其访问打印机等。我已经遇到一个已知问题:我使用XPS打印驱动程序,导致弹出对话框。 这是您在服务器上无法做到的,并且没有阻止或检测到这种情况的真正方法。

请记住,此服务接口仅允许发送流。 如果要添加额外的数据,则必须使用消息合同,如大数据和流媒体中的 msdn所述。 在这种情况下,您的合同必须如下所示:

[MessageContract]
public class UploadStreamMessage
{
   [MessageHeader]
   public string appRef;
   [MessageBodyMember]
   public Stream data;
} 

如果运行所有这些(压力)测试,请考虑部署并安装。我敢肯定,您会说服任何人这不是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM