在microsoft HPC上通过Com-interop c# API打开excel文件

本文关键字:API 打开 excel 文件 Com-interop microsoft HPC | 更新日期: 2023-09-27 18:02:25

我正在Windows hpc上工作,我正在尝试制作一个在网格上运行excel宏的小程序。我正在使用Com互操作API
它在我的计算机上工作得很好,它运行不同的VBA宏,但是当我在网格上使用它时,它不再工作了。Open方法不能正常工作。

workBook = excelApp.Workbooks.Open(path, Type.Missing,false, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

下面是翻译自法语的异常:

异常发现:类型:System.Runtime.InteropServices.COMException消息:Microsoft Office Excel无法访问文件

' server ' ' test.xls路径。有多种可能性:

  • 文件名或路径不存在
  • 文件当前被另一个程序使用
  • 您尝试使用的工作簿与已打开的另一个工作簿同名

来源:Microsoft Office Excel

Stacktrace: at Microsoft.Office.Interop.Excel.Workbooks。Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)在namespace.ExcelFile。readExcel(Application excelApp) in E:'path'ExcelFile.cs:line 37

我已经尝试使用与应用程序中使用的帐户相同的帐户从计算节点访问该文件,并且它工作正常。我可以访问它,似乎没有其他程序使用它,Excel没有打开。
编辑:我也可以在不使用微软API(头节点)的计算节点上运行我的小应用程序。

在microsoft HPC上通过Com-interop c# API打开excel文件

因此,在使用HPC处理实例化应用程序(如office COM)的COM API时,需要记住一些事情。在本地运行时,您似乎已经涵盖了权限;然而,当以服务的名义运行时,它就变得有点棘手了。

HPC在托管你的服务时模拟IIS;因此,我们必须同样对待;在IIS中,当您需要通过WCF服务运行这些应用程序之一时,您通常指定允许AppPool的身份启动一个配置文件,该配置文件将为应用程序配置文件目录提供访问权限以执行操作。你还必须确保在没有HPC的情况下运行这些服务时对应用程序池所做的任何设置也反映在你放置在HPC的服务注册目录中的服务配置文件中。

如果这个应用程序是一个32位的应用程序(你的应用程序不是COM+),你必须添加一个条目到serviceregistertag来指定它,就像你在IIS中配置应用程序池来接受x86应用程序一样。默认情况下,HPC在Broker的内部配置文件中指定architecture="X64"。

<microsoft.Hpc.Session.ServiceRegistration>
    <service assembly="C:'ServicesR2'OfficeService.dll"
      contract="OfficeService.IOfficeService" type="OfficeService.OfficeService"
      includeExceptionDetailInFaults="true" maxConcurrentCalls="0"
      serviceInitializationTimeout="60000" enableMessageLevelPreemption="true"
      stdError="" maxMessageSize="65536" soaDiagTraceLevel="Off"
      architecture="X86" />
</microsoft.Hpc.Session.ServiceRegistration>

确保在以下位置有一个名为"Desktop"的目录:

C: ' Windows ' SysWOW64 ' config ' systemprofile 'C:'Windows'System32'config' systemprofile '

这适用于集群中的所有节点;如果你只运行32位的windows,你可以忽略SysWow64目录位置。

接下来你需要去检查Office Excel的DCOM设置。为此,只需打开一个运行对话框并键入:

Dcomcnfg -32

我们添加-32来打开32位DCOM配置,因为Office只提供32位COM+对象来消费(对于2010年及以下,我不能评论365/2013)。

确保在位置下勾选"在此计算机上运行应用程序"。

确保在安全性下,您的帐户具有启动和激活权限,访问权限和配置权限的完全控制。如果您的用户是该系统的管理员帐户,则不需要进行任何更改,因为默认情况下Admin具有这些权限。

如果运行此任务的计算节点是Windows Server 2008 R2机器,请在"身份"页签中指定—"启动用户"。如果运行此任务的计算节点是一台windows Server 2012机器,请指定"this User"并提供您的凭据;或者指定交互用户。对于后者,我运气不好,所以我建议使用前者。

一旦你处理了这些事情,你的HPC服务应该可以正确地执行应用程序,而不会看到那些令人讨厌的COM+失败错误。

此外,您需要额外确保在退出时清除应用程序;我强烈建议你写一个小例程作为你的WCF服务的最后一个,当你完成时杀死excel进程;我发现在HPC下使用Excel时,通常的终止应用程序的方法是不可靠的。

当您说您可以访问它时,您是指通过使用资源管理器的文件系统,还是通过代码?是否可能您的代码不喜欢路径或认为存在权限问题?

如果添加如下内容,结果是什么?

 System.IO.FileInfo info = new System.IO.FileInfo(path);
 if(info.Exists)
 {
      System.Security.Permissions.FileIOPermission permission =
           new System.Security.Permissions.FileIOPermission(
               System.Security.Permissions.FileIOPermissionAccess.AllAccess, path);
       permission.Demand();
 }
 else{ 
      throw new System.IO.FileNotFoundException(path);
 }