【问题标题】:Excel 2007 automation on top of a Windows Server 2008 x64基于 Windows Server 2008 x64 的 Excel 2007 自动化
【发布时间】:2010-10-26 05:15:14
【问题描述】:

我很清楚 Microsoft 支持基础文章指出不支持自动化办公产品 UI 较少。 Windows Server 2008 x64 和 Excel 2007 似乎强制执行给定的语句。

我在 NT 服务(本地系统帐户)的 OnStart 方法中运行以下代码。当您在控制台应用程序中运行相同的代码时,它所做的只是 Excel 自动化。

提供的代码有两部分。第一部分启动 Excel,创建一个新工作簿并将其保存到给定的文件名。第二部分启动一个新的 Excel 实例并打开给定的文件。打开操作以这个异常结束:

服务无法启动。 System.Runtime.InteropServices.COMException (0x800A03EC):Microsoft Office Excel 无法访问文件“c:\temp\test.xls”。有几个可能的原因:

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

为什么自动 Excel 能够启动并将文件写入磁盘,但在询问“仅”打开现有文件时却失败了?

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
// launch excel and create/save a new work book
Microsoft.Office.Interop.Excel.ApplicationClass excel = new       Microsoft.Office.Interop.Excel.ApplicationClass();
excel.UserLibraryPath, excel.Interactive));
//            
string filename = "c:\\temp\\test.xls";
if(System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
//
excel.Workbooks.Add(System.Reflection.Missing.Value);
excel.Save(filename);
excel.Quit();
excel = null;
// lauch new instance of excel and open saved file
excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
    Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open(filename,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                true,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                false,
                false,
                System.Reflection.Missing.Value,
                false,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value);
     book.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
      book = null;
  }
  finally
  {
      excel.Quit();
      excel = null;
  }
  //
  GC.Collect();

【问题讨论】:

  • 仅供参考:相同的代码就像部署到 Windows Server 2003 R2 x64 和 Excel 2007 的魅力一样工作。
  • -1 帮助新读者从服务器进程尝试 Office 自动化。
  • @约翰桑德斯。好吧,以下要求该怎么做:在 xls 文件中运行“更新”,无需自动化?只是好奇(并不是说这样的设计一开始就是一个好主意,但用户就是用户......)
  • @Vinzz:如果有任何其他无法满足的要求,你会怎么做:说实话。
  • @John Saunder:唉,在这种特殊情况下,它可以(并且已经)遇到了。但事实上,试图说服另一种解决方案是一个更好的主意,这是正确的做法。

标签: com excel-2007 office-automation


【解决方案1】:

解决方案非常简单。 msdn论坛帖子可以找到here

长话短说,我在这里发布解决方案,感谢 H Ogawa

这个解决方案是...

・Windows 2008 Server x64

请制作这个文件夹。

C:\Windows\SysWOW64\config\systemprofile\Desktop

・Windows 2008 Server x86

请制作这个文件夹。

C:\Windows\System32\config\systemprofile\Desktop

...而不是 dcomcnfg.exe。

此操作消除了我系统中的办公自动化问题。

systemprofile 文件夹中似乎需要一个 Desktop 文件夹才能通过 Excel 打开文件。

它从Windows2008消失,Windows2003有文件夹, 我认为它会导致这个错误。

【讨论】:

  • 哇,就这样?我也遇到了这个问题,我认为这是在会话 0 中运行 Excel 的问题。我使用 .Net 远程处理在登录到会话 1 的用户下运行 Excel ...
  • 你和 H Ogawa 都非常摇滚。我也在调查 Session 0 的情况,这似乎是一个完全的红鲱鱼。
  • 我很高兴地报告这解决了 Windows 7 + IIS 下的相同问题。感谢您提供这个出色的解决方案!
  • +1 以获得最简单的解决方案和最可怕的错误。
  • 谢谢!!!我在带有 IIS7 的 Windows 7 64bit 中遇到了同样的问题。创建 C:\Windows\SysWOW64\config\systemprofile\Desktop 为我解决了问题。我以前也尝试过 dcomcnfg.exe 权限建议,这是我在其他论坛帖子中找到的。因此,虽然我不能确定桌面文件夹的创建是否能单独解决我的问题,但我确信在我创建该文件夹后一切都开始工作了!非常感谢克里斯!
【解决方案2】:

也如源中所述,您需要为桌面文件夹设置正确的权限。 这适用于 Windows 2008-64 位和 Office 2010 32 位。

  1. 创建目录“C:\Windows\SysWOW64\config\systemprofile\Desktop”(适用于 64 位 Windows)或“C:\Windows\System32\config\systemprofile\Desktop”(适用于 32 位 Windows)

  2. 为用户“Network Services (Service Réseau)”分配创建文件夹的以下权限:

读取和执行、列出文件夹内容、读取

约翰。

【讨论】:

  • 这是一个可怕的谜题中最后一个缺失的部分。谢谢!
【解决方案3】:

我经常发现调用 Quit() 不足以释放资源。尝试添加:-

System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

在 Quit() 语句和将其设置为 null 之间。

【讨论】:

  • 谢谢,你猜怎么着,我已经删除了这部分代码以使示例尽可能简单。顺便说一句:ReleaseComObject 返回一个 int 并且应该放在循环中
  • 如果您的程序退出,也很高兴等待 GarbageCollector:GC.Collect(); GC.WaitForPendingFinalizers();
【解决方案4】:

除了提到的错误之外,还有更多错误,您需要解决这些错误才能使 Excel 在 Windows Server 2007 64 位上运行。经过两天的努力,请参阅the steps I worked out

【讨论】:

    【解决方案5】:

    如果您使用的是 Apache,您可能还需要按照以下步骤使 MS Word 正常工作(以及其他答案中概述的所有内容):

    下面的屏幕截图显示了您需要调出的两个对话框:

    对于 Apache:

    服务->Apache->右键单击(属性)->登录选项卡

    MS Word:

    启动 dcomcnfg.exe->控制台根目录->组件服务->计算机->我的电脑->DCOM 配置->查找 Microsoft 应用程序->右键单击(属性)->身份选项卡

    **如果您找不到 MS Word,请确保根据您安装的 Office 版本启动正确的 DCOM 配置(64 位与 32 位)。

    这里有两个选项,您可以将 Apache 设置为使用本地系统帐户并选中复选框以允许桌面交互。如果这样做,则需要将 MS Word 的 Identity 设置为 Interactive User

    否则,您需要将两者都设置为同一个用户(最好是登录的用户),如图所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2013-01-03
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2010-11-03
      相关资源
      最近更新 更多