首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在microsoft HPC上通过Com-interop C# API打开excel文件。

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

Stack Overflow用户
提问于 2013-03-05 13:05:26
回答 2查看 3.7K关注 0票数 2

我正在开发一个Windows,并试图制作一个在网格上运行高性能宏的小程序。

它在我的计算机上运行很好,它运行不同的VBA宏,但是当我在网格上使用它时,它不再工作了。Open方法不能正常工作。

代码语言:javascript
复制
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无法访问该文件 \server\path\test.xls。有多种可能性:

  • 文件名或路径不存在
  • 该文件目前用于par另一个程序。
  • 您试图使用的工作簿与已打开的另一个工作簿的名称相同。

来源:

堆栈跟踪:在Microsoft.Office.Interop.Excel.Workbooks.Open(String文件名、对象UpdateLinks、对象ReadOnly、对象格式、对象密码、对象WriteResPassword、对象IgnoreReadOnlyRecommended、对象起源、对象划界器、对象可编辑、对象通知、对象转换器、对象AddToMru、对象本地、对象CorruptLoad)上,E:\path\ExcelFile.cs:line 37中的namespace.ExcelFile.readExcel(Application excelApp)

我尝试使用与应用程序中使用的帐户相同的帐户从计算节点访问该文件,它运行良好。我可以访问它,似乎没有其他程序使用它,而且Excel也没有打开。

编辑:我也可以在计算节点上运行我的小应用程序,而不用使用Microsoft (head节点)。

我错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-08 12:58:51

因此,在处理在使用HPC时实例化应用程序(例如office )的COM时,需要记住一些事情。当您在本地运行时,您似乎已经涵盖了权限;但是,当在服务的幌子下运行时,它会变得更加棘手。

HPC模拟IIS,因为它承载了您的服务;在IIS中,当您需要通过WCF服务运行这些应用程序之一时,通常指定允许AppPool的标识启动配置文件,这将使应用程序配置文件目录能够访问执行操作。您还必须确保在没有HPC的情况下,为运行这些服务而对应用程序池所做的任何设置也反映在您放置在HPC服务注册目录中的Service文件中。

如果此应用程序是32位应用程序(您的应用程序不是COM+),则必须向SericeRegistration标记中添加一个条目,以按照在IIS中配置应用程序池以接受x86应用程序的方式指定此项。默认情况下,HPC在代理的配置文件中内部指定architecture="X64“。

代码语言:javascript
复制
<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 64\config\systemprofile\C:\Windows\System32 32\config\systemprofile\

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

接下来,您需要检查Office的DCOM设置。要做到这一点,只需打开一个run对话框并键入:

Dcomcnfg 32

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

确保选中“在此计算机上运行应用程序”。

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

如果运行此任务的计算节点是Windows 2008 R2机器,则在Identity选项卡中指定“启动用户”。如果运行此任务的计算节点是windows 2012机器,请指定-“此用户”并提供您的凭据;或指定交互式用户。我对后者的运气微乎其微,所以我建议前者。

一旦您处理了这些问题,您的have就应该正确地执行应用程序,而不会看到那些令人讨厌的失败的COM+错误。

此外,您还需要特别确定在退出时清理应用程序;我强烈建议您为WCF服务编写一个小例程,以便在完成时终止excel进程;我发现,在HPC下使用Excel时,通常终止应用程序的方法是不可靠的。

票数 2
EN

Stack Overflow用户

发布于 2013-03-05 22:33:03

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

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

代码语言:javascript
复制
 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);
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15224547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档