无法访问excel文件

本文关键字:文件 excel 访问 | 更新日期: 2023-09-27 17:49:36

我正在开发一个windows服务,生成一个报告。该报告有一个模板。模板格式为excel。该文件被复制到输出文件夹。

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

然后我准备了一个服务安装程序。该服务安装在Local System帐号下。因此,这个excel模板文件被标记为content,并与可执行文件一起复制到安装目录中。

但是当服务启动时,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模板文件?或者还有其他选择吗?

无法访问excel文件

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

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

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

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

  • User Identity:办公应用程序在运行时使用用户身份,即使自动化启动应用程序。应用程序尝试初始化工具栏,菜单,选项、打印机和一些基于用户设置的外接程序启动应用程序的用户的注册表单元。很多服务在没有用户配置文件的帐户(例如SYSTEM)下运行帐户或IWAM_[servername]帐户)。因此,Office可能不会启动时正确初始化。在这种情况下,Office返回一个在CreateObject函数或CoCreateInstance函数上出现错误。即使Office应用程序可以启动,其他功能也可能无法启动

  • 与桌面的交互性: Office应用程序假定它们正在交互式桌面下运行。在一些在某些情况下,应用程序可能需要使其可见自动化功能正常工作。如果发生意外错误,或者如果需要一个未指定的参数来完成一个函数,Office的设计目的是用一个模态对话框提示用户询问用户想要做什么。的模态对话框非交互式桌面不能被忽略。因此,这条线无限期地停止响应(挂起)。虽然有一定的编码实践可以帮助减少这个问题发生的可能性实践不能完全防止这个问题。这个事实本身就使得从服务器端环境运行Office应用程序是有风险的不支持的。

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

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

我也遇到过同样的问题。

我做了一个。bat文件,我把它叫做。exe文件。

最后,我从任务调度器操作中调用。bat文件。