在asp.net中打开Word文件时应用程序没有响应

时间:2012-11-22 15:23:36

标签: c# asp.net .net c#-4.0 office-interop

我想打开一个docx文件,然后使用Microsoft.Office.Interop.Word包将其转换为asp.net中的pdf文件。

这是我在asp按钮点击事件中编写的代码:

object fileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
                        Object missing = Type.Missing;
                        object saveName = strURL.Replace(".docx", ".pdf");
                        object openName = docPath + "\\T4.docx";

                    Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
                    Microsoft.Office.Interop.Word.Document doc = wdApp.Documents.Open(openName,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
doc.SaveAs(saveName,fileFormat,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);
 doc.Close(ref missing, ref missing, ref missing);

但执行时 wdApp.Documents.Open()行有一些问题。

浏览器符号似乎总是加载。

我不知道这个错误的原因是什么原因。

2 个答案:

答案 0 :(得分:2)

Microsoft不支持在服务器环境中自动执行Office应用程序,this KB article解释了尝试时可能出现的一些潜在问题。

我建议您寻找第三方组件,例如Aspose。

答案 1 :(得分:2)

当Word尝试向用户显示对话框时,可能会发生这种情况。互操作不够智能,无法抑制所有这些对话框。请尝试以下方法:

1)登录服务器并手动打开MS Word。可能存在某种需要用户确认的对话框(例如第一次运行Word时显示的许可对话框)。一旦您手动通过这些对话框,他们将不再是互操作的问题。 (也可以尝试打开其中一个文档。也许问题在于文档本身。)

2)在代码中抑制尽可能多的对话框。我知道2个这样的地方(DisplayAlerts和NoEncodingDialog)。

var word = new Word.Application();
word.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

Word.Documents documents = word.Documents;
documents.Open(openName, NoEncodingDialog: true);

附注,但非常重要:为避免内存泄漏,您需要非常小心如何引用和处理这些COM对象。遵循this thread中的建议。如果你这样做,你可以忽略那些说你不应该与ASP.NET互操作的反对者。 (多年来,我有一台服务器正在完成您正在尝试做的事情 - 使用Word互操作将.docx转换为.pdf - 即使在负载很重的情况下也能正常工作,但只是因为我已经遵循了该主题中的建议。)