0

我正在使用 Microsoft.Office.Interop,使用 C# 扫描 word 和 excel 文件,我将文件作为用户的输入,将其保存在本地目录中,然后扫描它的 Interop 库。它在我的本地发布上运行良好,但是当我在服务器上发布它时它不扫描 Word 或 Excel 文件。我的服务器上安装了 MS-Office,与我的 PC 上的版本相同。我还需要做什么?我已经在我的 bin 目录中复制了所需的 DLL。这就是我阅读word文件的方式

public static string word_to_text(string source)
{
  Word.Application newApp = new Word.Application();

  object Source = source;
  object Unknown = Type.Missing;

  object miss = System.Reflection.Missing.Value;
  object readOnly = true;
  Microsoft.Office.Interop.Word.Document docs = newApp.Documents.Open(ref Source, ref miss, ref readOnly, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
  string totaltext = "";
  for (int j = 0; j < docs.Paragraphs.Count; j++)
  {
    totaltext += " \r\n " + docs.Paragraphs[j + 1].Range.Text.ToString();
  }
  docs.Close();
  newApp.Quit();
  return totaltext;
}

我得到了这个例外

由于以下错误,检索具有 CLSID {000209FF-0000-0000-C000-000000000046} 的组件的 COM 类工厂失败:80070005 访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))。

我通过关注这篇文章修复了它 但是现在我遇到了 excel 和 word 文件的问题。如果是 Word 文件,它没有从上面的代码中读取文件,docs 对象似乎为空。如果是 Excel 则显示异常

Microsoft Office Excel cannot access the file 'myfile path'. There are several possible reasons: • The file name or path does not exist. • The file is being used by another program. • The workbook you are trying to save has the same name as a currently open workbook.

我阅读了授予文件夹权限的解决方案,并在 system32 内创建了 Desktop 文件夹在这里,这两种解决方案都不适用于我:(只有在我发布它时才会出现问题

4

1 回答 1

1

您不应在服务器中使用 Office 自动化。一次只有一个线程可以访问 Word,相对于其他选项来说速度很慢,而且 Word 不是为服务器端执行而设计的。

使用 OpenXML SDK 要好得多:

http://www.microsoft.com/en-us/download/details.aspx?id=5124

或其他一些包装器:

http://docx.codeplex.com/

http://www.codeproject.com/Articles/87711/Manipulate-Docx-with-C-without-Microsoft-Word-inst

如果你觉得你绝对必须在服务器上使用 Office 自动化(你不应该),那么至少将它放在一个单独的进程中并将请求加入到另一个进程中。这样,您可以确保一次只处理一个请求,您可以安全地授予另一个进程所需的权限,如果 Word 停止,您可以终止它和辅助进程。

于 2013-08-26T13:22:58.920 回答