我们使用Excel在ASP.NET Web服务中将SpreatSheetML转换为XLS。此外,如果用户选中正确的复选框,我们会生成一个使用Excel打印电子表格的线程。
最近,我们在新环境中部署了应用程序,然后我们开始遇到问题:第一次有人试图打印时,Excel似乎挂在服务器上 - 即调用PrintOut
方法工作簿永远不会返回。
但是,如果我们以应用程序池身份登录到服务器并打开Excel,请将某些内容发送到打印机,然后再将其关闭,打印将从此开始工作!
我怀疑Excel正在显示invisible dialog
- 症状与我们之前的情况相同,这时Excel似乎停止了“无法使用对象链接和嵌入” - Excel打开时出现的-dialog
我知道使用服务器端Office自动化很糟糕,但这是一个很难改变的遗留应用程序,所以请不要只是建议我重新设计我们的解决方案。
有没有人有过这种行为的经历?
答案 0 :(得分:1)
好吧,似乎没有人遇到过这个问题。
非常奇怪的是,我的夜间工作(普通的.NET .exe)完全能够打印 - 只有我的网络服务才有这个问题。
所以我通过做我应该在很久以前做过的事情解决了这个问题:我用Topshelf创建了一个简单的Windows服务,响应一些MSMQ消息并进行打印,然后我的Web服务可以订购打印-out通过消息队列。
各方面都好多了!
答案 1 :(得分:1)
我通过Web服务中的互操作使用Microsoft Excel,Word和PowerPoint将Office文档打印为PDF格式,因此无法解决问题(性能不佳,挂起进程,崩溃进程等)。我也遇到过我怀疑是因为看不见的对话框(可能是文件已损坏,建议只读,文件受密码保护等等)。
我知道有些工具不使用Office,但它们非常昂贵。我的解决方案是切换到自动化OpenOffice。 OpenOffice看起来要稳定得多,而且我已经抛弃了悬挂流程等等。
所以,虽然我想我说“不要自动化Microsoft Office”,但我并不是说你完全放弃了自动化;只是因为我已经比使用Microsoft Office更加成功地实现了OpenOffice的自动化。
答案 2 :(得分:0)
SpreadsheetGear for .NET可以读取xls或xlsx工作簿,并且可以打印到默认打印机而不显示任何对话框(请参阅WorkbookView.Print()方法)。
您可以下载评估here。
免责声明:我拥有SpreadsheetGear LLC
答案 3 :(得分:-2)
和很多人一样,我已经看到了这种行为。它是由在服务器中使用Office API引起的,尤其是多线程ASP.NET应用程序。
然而,你已经说过你不想知道自己不会在脚下射击,所以还有更多话要说。你似乎被早先愚蠢的后果所困。
好的,如果您已经听过这个,请阻止我:
一名男子在StackOverflow上提问。他说,“因此,当我从服务中自动化Office应用程序时,会发生不好的事情”。因此,John Saunders说,“因此,不要在服务内部自动化Office应用程序。从桌面应用程序内部自动化它,就像微软打算完成的那样。”
当请求涉及需要Excel的内容时,您应该创建一个运行Windows窗体应用程序的进程。应用程序可能必须从没有窗口开始,或者您可能需要在 Remote Desktop 连接的上下文中启动它。在任何情况下,要执行的任务可以作为命令行参数传递,或者程序可以托管WCF服务以向其发送命令。
这个程序可以像Excel期望的那样调用Excel。它甚至可以处理多个Excel命令(一次一个)。但是,如果它挂起,则可以终止该进程并启动另一个进程。
我从来没有尝试过这个,但听起来它比试图让Office Automation做一些它不打算做的事情更好。