25

我很清楚 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();
4

5 回答 5

31

解决方案非常简单。可以在这里找到 msdn 论坛主题

长话短说,我在这里发布解决方案,归功于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 有该文件夹,我认为它会导致此错误。

于 2009-07-07T07:39:16.733 回答
7

同样如源代码中所述,您需要为桌面文件夹设置正确的权限。这适用于 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)”分配所创建文件夹的以下权限:

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

约翰。

于 2010-12-06T03:13:24.223 回答
2

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

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

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

于 2009-05-14T16:46:05.220 回答
1

为了让 Excel 在 64 位 Windows Server 2007 上运行,您需要解决的错误比提到的错误多得多。请参阅在此工作两天后制定的步骤!

于 2011-04-15T20:56:15.480 回答
1

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

下面是一个屏幕截图,显示了您需要调出的两个对话框: 在此处输入图像描述

对于阿帕奇:

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

微软字:

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

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

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

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

于 2014-05-29T20:43:16.897 回答