12

我正在开发 Windows 服务,生成报告。该报告有一个模板。这个模板是在一个 excel 文件中准备的。该文件被复制到输出文件夹。

在开发过程中,我像控制台应用程序一样启动了该服务,并且访问该文件没有问题。

然后我准备了一个服务安装程序。该服务安装在Local System帐户下。所以这个excel模板文件被标记为内容并与可执行文件一起复制到安装目录。

但是,当服务启动时,excel 似乎无法访问此文件。该服务安装到c:\Program Files (x86)\Our Company\Service Name\. 目标操作系统是 Windows Server 2008。在测试时,我使用的是 Windows 7 并遇到了同样的问题。

我使用以下代码访问excel。

using Excel = Microsoft.Office.Interop.Excel;    
//...
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
//the following line throws an exception
Excel.Workbook xlWorkBook = xlApp.Workbooks.Open(@"path"); 

我还尝试将 excel 模板文件复制到某个临时目录(服务有权写入该目录 - 这是经过测试的)并尝试从那里打开它,但没有成功(虽然这个变体在控制台应用程序中运行良好好)。

错误消息是:

Microsoft Office Excel 无法访问文件 /path/。有几个可能的原因:

1. The file name or path does not exist.
2. The file is being used by another program.
3. The workbook you are trying to save has the same name as a currently open workbook.

如何让 windows 服务访问这个 excel 模板文件?或者还有其他选择吗?

4

3 回答 3

14

要使用本地系统帐户在用户服务下安全运行 Office 应用程序(Excel 和其他),您必须了解两个重要事项:1) 在 Windows Server 2008/2008 R2 中,您必须手动创建两个文件夹:C:\Windows\system32\config\systemprofile \desktop
C:\Windows\SysWow64\config\systemprofile\desktop(仅适用于 x64 版本) 如果没有此文件夹,您将无法从本地 SystemAccount 更正运行办公应用程序

2)如果您的服务配置为没有桌面交互,那么在第一次启动办公应用程序(例如 Excel)时冻结用户凭据对话框 - 在此模式下您看不到此窗口 - 要解决此问题,请启用桌面交互,切换到办公窗口后您服务运行它并手动输入凭据。

那里的其他信息(使用谷歌翻译阅读)。

于 2013-04-26T12:48:05.120 回答
9

有一篇详细的 MS 知识库文章,标题为“Office 服务器端自动化的注意事项”。一些关键摘录:

  • 用户身份:Office 应用程序在应用程序运行时假定用户身份,即使自动化启动应用程序时也是如此。应用程序尝试根据启动应用程序的用户的用户注册表配置单元中的设置来初始化工具栏、菜单、选项、打印机和一些加载项。许多服务在没有用户配置文件的帐户下运行(例如 SYSTEM 帐户或 IWAM_[servername] 帐户)。因此,Office 可能无法在启动时正确初始化。在这种情况下,Office 在 CreateObject 函数或 CoCreateInstance 函数上返回错误。即使可以启动 Office 应用程序,如果不存在用户配置文件,其他功能也可能无法正常工作。

  • 与桌面的交互性:Office 应用程序假定它们在交互式桌面下运行。在某些情况下,可能需要使应用程序可见,某些自动化功能才能正常工作。如果发生意外错误,或者需要未指定的参数来完成某项功能,Office 旨在通过一个模式对话框提示用户,询问用户想要做什么。无法关闭非交互式桌面上的模式对话框。因此,该线程无限期地停止响应(挂起)。尽管某些编码实践可以帮助降低出现此问题的可能性,但这些实践并不能完全防止该问题。仅这一事实就使得从服务器端环境运行 Office 应用程序存在风险且不受支持。

显然,正如评论中指出的那样,使用该SYSTEM帐户是一个错误。您需要在具有用户配置文件的帐户下运行该服务。

但即使你解决了这个问题,另一个要点也会杀了你。Office 应用程序确实假设它们在交互式桌面下运行。我的建议是放弃尝试通过服务自动化 Office。改用 Aspose 之类的库。或者在交互式桌面上运行该过程。

于 2012-12-26T14:07:54.350 回答
0

我刚刚遇到了同样的问题。

我制作了一个 .bat 文件,我在其中调用了 .exe 文件。

最后,我从任务调度程序操作中调用了 .bat 文件。

它工作正常。

于 2018-12-11T10:10:17.120 回答