使用Microsoft.Office.Interop Word和Excel

时间:2013-08-26 12:25:24

标签: c# asp.net

我正在使用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))。

我按照this post修正了它 但是现在我遇到了excel和word文件的问题。 对于Word文件,它不从上面的代码中读取文件,docs对象看起来是null。 在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 Here内创建Desktop文件夹,这两种解决方案对我都不起作用:( 这个问题只有在我发布时才会出现

1 个答案:

答案 0 :(得分: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暂停,您可以终止它和辅助进程。