无法访问excel文件

hor*_*rgh 11 c# excel interop windows-services

我正在开发一个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"); 
Run Code Online (Sandbox Code Playgroud)

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

错误消息sais:

Microsoft Office Excel无法访问文件/路径/.有几个可能的原因:

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.
Run Code Online (Sandbox Code Playgroud)

如何让Windows服务访问此Excel模板文件?或者还有另一种选择吗?

小智 10

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

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

其他信息(使用谷歌翻译器来读取).

  • 我使用 Windows 7 时遇到此问题。添加路径 C:\Windows\system32\config\systemprofile\desktop 修复了该问题。非常感谢您的帖子。 (2认同)

Dav*_*nan 7

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

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

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

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

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