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 时出