Microsoft.Office.Interop.Word - Word 在尝试打开文件时遇到错误

Posted

技术标签:

【中文标题】Microsoft.Office.Interop.Word - Word 在尝试打开文件时遇到错误【英文标题】:Microsoft.Office.Interop.Word - Word experienced an error trying to open the file 【发布时间】:2021-01-29 13:06:19 【问题描述】:

我们有一个 ASP.Net Web 应用程序 (C#),它通过 Microsoft.Office.Interop.Word 打开一个 Word 文件。

首先,我意识到这不是推荐的方法,应该考虑使用 TextControl 或 Asppose 等库,我们将考虑用这样的库替换 Microsoft.Office.Interop.Word 的使用。

但是,在短期内,我想让它工作,我们的代码在我的开发机器上工作,客户端的测试服务器而不是他们的 UAT 服务器。

客户端的测试服务器和 UAT 服务器看似一模一样,我已经尝试查看各种 DCOM Config 设置,但并不高兴。

我查看了有关 Microsoft.Office.Interop.Word 的其他 Stack Overflow 问题,但没有任何建议有帮助。

为了帮助测试问题,我整理了一个简单的测试应用程序,它尝试使用以下代码打开 Word 文档

var wordApplication = new Application();            
var wordDocument = wordApplication.Documents.Open(txtPath.Text);
wordApplication.Visible = true;

当运行 Word 进程时,任务管理器中会出现以下错误。我显然已经检查了文件权限等。欢迎提出任何建议。

【问题讨论】:

假设文件存在(测试),它看起来像一个权限错误,“试图打开文件”。您在某处托管您的 MVC。您确定 IIS 用户有权打开文档或访问目录吗? 您可以考虑使用 NuGet 包 DocumentFormat.OpenXml docs.microsoft.com/en-us/dotnet/api/…。 您是否尝试过使用 Server.MapPath:docs.microsoft.com/en-us/dotnet/api/…。这篇文章也可能有用:***.com/questions/275781/… @Goodies 它肯定会到达文件,就好像我传入一个不存在的路径一样,收到了不同的错误消息。我还在文件上添加了“所有人”权限,以仔细检查它不是权限。 @user9938 - 感谢查看 DocumentFormat.OpenXml。不幸的是,Microsoft.Office.Interop.Word 的使用在此应用程序中很普遍,因此即使从长远来看,换掉是最好的方法,也不是一件容易的事。 【参考方案1】:

以下演示项目展示了如何将 Word 文档文件上传到 Web 服务器,然后使用Microsoft.Office.Interop.Word 读取文件。

先决条件

MS Word 安装在 Web 服务器计算机上。 (打开 Word 以确保没有 MessageBox 出现——例如“Microsoft Word 不是您查看和编辑文档的默认程序...”) 网站包含一个名为:Uploads 的文件夹

创建一个 ASP .NET Web 应用程序

VS 2017

打开 Visual Studio 展开已安装 展开Visual C# 点击网络 选择 ASP.NET Web 应用程序 (.NET Framework) 点击确定 选择 点击确定

VS 2019

打开 Visual Studio 点击无代码继续 点击文件 选择新建 选择项目 C# Windows 网络 单击ASP .NET Web 应用程序(.NET Framework) 点击下一步 指定项目名称(名称:AspNetWebApp2) 点击创建 点击清空 取消选中为 HTTPS 配置 点击创建

注意:从现在开始,VS 2017 和 VS 2019 的流程相同。

添加网络表单:

在VS菜单中,点击Project 选择添加新项目 选择Web 表单(名称:default.aspx) 点击添加

打开解决方案资源管理器

在VS菜单中,点击查看 选择解决方案资源管理器

在解决方案资源管理器中,双击“default3.aspx”。将代码替换为以下内容:

default3.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default3.aspx.cs" Inherits="AspNetWebApp2.Default3" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
         <h3> File Upload:</h3>
         <br />
         <asp:FileUpload ID="FileUpload1" runat="server" />
         <br /><br />
         <asp:Button ID="btnsave" runat="server" onclick="btnsave_Click"  Text="Save" style="width:85px" />
         <br /><br />
         <asp:Label ID="lblmessage" runat="server" />
      </div>

        <div>
            <h2>Data:</h2>
            <div>
                <asp:TextBox ID="textBoxData" runat="server" Height="336px" TextMode="MultiLine" Width="603px"></asp:TextBox>
            </div>
        </div>
    </form>
</body>
</html>

添加引用(Microsoft Word xx.0 对象库)

在VS菜单中,点击Project 选择添加参考 展开COM 检查 Microsoft Word xx.0 对象库(例如:Microsoft Word 16.0 对象库)

在解决方案资源管理器中,双击“default3.aspx.cs”并将代码替换为以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using Word = Microsoft.Office.Interop.Word;

namespace AspNetWebApp2

    public partial class Default3 : System.Web.UI.Page
    
        protected void Page_Load(object sender, EventArgs e)
        
            
        

        protected void btnsave_Click(object sender, EventArgs e)
        
            bool isVisible = true;
            StringBuilder sb = new StringBuilder();
            Word.Application wordApp = null;
            Word.Document doc = null;
            Word.Documents documents = null;

            if (FileUpload1.HasFile)
            
                try
                
                    sb.AppendFormat(" Uploading file: 0", FileUpload1.FileName);

                    //saving the file

                    string localDir = System.IO.Path.Combine(Server.MapPath("."), "Uploads");

                    if (!System.IO.Directory.Exists(localDir))
                    
                        string errMsg = String.Format("<script>alert('Error - Folder does not exist (0)');</script>", localDir.Replace(@"\",@"\\"));
                        Response.Write(errMsg);
                    

                    string localFn = System.IO.Path.Combine(Server.MapPath("."), "Uploads", FileUpload1.FileName);
                    FileUpload1.SaveAs(localFn);

                    //Showing the file information
                    sb.AppendFormat("<br/> Save As: 0", FileUpload1.PostedFile.FileName);
                    sb.AppendFormat("<br/> File type: 0", FileUpload1.PostedFile.ContentType);
                    sb.AppendFormat("<br/> File length: 0", FileUpload1.PostedFile.ContentLength);
                    sb.AppendFormat("<br/> File name: 0", FileUpload1.PostedFile.FileName);

                    wordApp = new Word.Application();

                    //suppress displaying alerts (such as prompting to overwrite existing file)
                    wordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;

                    //set Word visibility
                    //wordApp.Visible = false;
                    wordApp.Visible = isVisible;

                    if (wordApp != null)
                    
                        if (File.Exists(localFn))
                        
                            StringBuilder sbData = new StringBuilder();

                            doc = wordApp.Documents.Open(localFn, System.Reflection.Missing.Value, false, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, isVisible, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
                            //doc = documents.Open(localFn);

                            doc.Activate();

                            foreach (Word.Paragraph p in doc.Content.Paragraphs)
                            
                                Debug.WriteLine(p.Range.Text);
                                //Response.Write(p.Range.Text);
                                sbData.AppendLine(p.Range.Text);
                            

                            textBoxData.Text = sbData.ToString();
                        
                        else
                        
                            Debug.WriteLine("Error: Filename '" + localFn + "' doesn't exist.");
                        
                    
                
                catch (Exception ex)
                
                    sb.Append("<br/> Error <br/>");
                    sb.AppendFormat("Unable to save file <br/> 0", ex.Message);
                
                finally
                
                    if (doc != null)
                    
                        doc.Close();
                    

                    if (documents != null)
                    
                        documents.Close();
                    

                    if (wordApp != null)
                    
                        wordApp.Quit();
                        wordApp = null;
                    
                
            
            else
            
                lblmessage.Text = sb.ToString();
            

            Debug.WriteLine(sb.ToString());
        
    

资源:

ASP.NET - File Uploading

【讨论】:

您会看到问题似乎已归结为应用程序池/DCOM 级别的权限,但是此代码仍然非常有用。非常感谢。【参考方案2】:

最后,按照https://***.com/a/16481091/1302730 中列出的步骤解决了我的问题。

我创建了一个新用户(在用户组中),名为 WordUser 我在 IIS 中创建了具有 WordUser 权限的新应用程序池;加载用户配置文件必须为 true DCOM 我已设置为使用 WordUser,在“安全”选项卡上,我添加了带有启动和激活权限以及访问权限的 WordUser

事实证明,本地用户的创建似乎启动了一些事情,即使我将应用程序切换为使用以前的应用程序池,并将 DCOM 设置切换为使用我的应用程序工作的先前规定的用户。

【讨论】:

以上是关于Microsoft.Office.Interop.Word - Word 在尝试打开文件时遇到错误的主要内容,如果未能解决你的问题,请参考以下文章

添加 Microsoft.Office.Interop.Excel 参考

访问 Microsoft.Office.Interop.Word.dll?

如何引用 Microsoft.Office.Interop.Excel dll?

Microsoft.Office.Interop 错误,即使在安装 PIA 之后

Microsoft.Office.Interop.Word - Word 在尝试打开文件时遇到错误

(C# / VB.NET) Microsoft.Office.Interop.PowerPoint.Shape.AddComment - 当“Microsoft Office”版本高于 2010 时出