无法访问Excel文件

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

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

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

但是,当服务启动时,excel似乎无法访问此文件。 该服务已安装到c:\Program Files (x86)\Our Company\Service Name\ 。 目标操作系统是Windows Server 2008.testing时,我使用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模板文件到一些临时目录(服务有权写 – 这是testing),并尝试从那里打开它,但没有成功(虽然这种变种适用于控制台应用程序好)。

错误信息是:

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模板文件? 还是有另一种select?

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

  • 用户身份 :即使在自动启动应用程序时,Office应用程序也会在应用程序运行时承担用户身份。 应用程序尝试基于启动应用程序的用户的用户registryconfiguration单元中的设置初始化工具栏,菜单,选项,打印机和一些加载项。 许多服务在没有用户configuration文件的帐户下运行(例如SYSTEM帐户或IWAM_ [服务器名称]帐户)。 因此,Office启动时可能无法正确初始化。 在这种情况下,Office在CreateObject函数或CoCreateInstance函数上返回一个错误。 即使Office应用程序可以启动,如果没有用户configuration文件存在,其他function可能无法正常工作。

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

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

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

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

2)如果你的服务configuration没有桌面交互,那么在第一次启动办公应用程序(例如Excel)冻结用户凭据对话框 – 你不能看到这个窗口在这种模式下 – 解决这个启用桌面交互,切换到办公室后窗口你的服务运行它并手动input信息。

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