怎样读取WORD文档内容

TLY1984 2011-08-30 03:54:12
现在想用C#读取一个WORD文档的文本内容 ,然后把获取的值附给一个string类型 是B/S项目的 请问怎么操作?
...全文
966 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
YnSky 2011-08-31
  • 打赏
  • 举报
回复
如果WEB服务器上安装了Office的话就简单了,在项目中引用Microsoft.Office.Interop.Word组件,就可以直接读取Word中的文本了。
//获得word文件的文本内容
public string Doc2Text(string docFileName)
{
//实例化COM
Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
object fileobj = docFileName;
object nullobj = System.Reflection.Missing.Value;
//打开指定文件(不同版本的COM参数个数有差异,一般而言除第一个外都用nullobj就行了)
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(ref fileobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj
);
//取得doc文件中的文本
string outText = doc.Content.Text;
//关闭文件
doc.Close(ref nullobj, ref nullobj, ref nullobj);
//关闭COM
wordApp.Quit(ref nullobj, ref nullobj, ref nullobj);
//返回
return outText;
}
YnSky 2011-08-31
  • 打赏
  • 举报
回复
Asp.net读取Word的实例与总结
通过一个实用例子完整演示了如何使用C#在ASP.NET里调用Word、自动化Word
,并且总结了实际应用中发现的问题,最后提出了有效的解决方案。
关键词:ASP.NET; C#; Word; 自动化; VBA; COM; 死进程;
1. 建立工程
在ASP.NET里操作Word的第一步就是添加COM引用到你的工程里,通过右键
点击“解决方案资源管理器”的“引用”,添加引用。选择COM选项卡,添加
Microsoft Word 12.0 Object Library(其中12.0是Word版本号,根据当前电脑上
安装的Word版本确定)。 ASP.Net会自动生成Word的COM包装类程序集添加到应用
程序目录里。
2. 代码逻辑
在服务器端访问本地存在的Word文件,并根据他新建一个文件,利用Word的
标签定位赋值。客户端浏览器通过文件链接访问到这个新生成的Word文件。
具体代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
object Missing = Type.Missing;
//取得Word文件路径
string strTemp = "doc/test.doc";
//新Word文件保存路径
string newFileName = "doc/test2.doc";
//创建一个名为WordApp的组件对象
Application WordApp = new ApplicationClass();
//必须设置为不可见
WordApp.Visible = false;
try
{
//创建以strTemp为模板的文档
object oTemplate = Server.MapPath(strTemp);
Document WordDoc = WordApp.Documents.Add(ref oTemplate, ref
Missing,ref Missing, ref Missing);
WordDoc.Activate();
//对标签"Title"进行填充
string strBM = "Title";
object objBM = strBM;
if(WordApp.ActiveDocument.Bookmarks.Exists(strBM) == true)
{
WordApp.ActiveDocument.Bookmarks.get_Item(ref objBM).Select();
WordApp.Selection.TypeText("公文标题");
}
//保存为新文件
object oNewFileName = Server.MapPath(newFileName);
WordDoc.SaveAs(ref oNewFileName, ref Missing,ref Missing, ref
Missing,ref Missing,ref Missing,ref Missing,
ref Missing,ref Missing,ref Missing, ref Missing, ref Missing, ref
Missing, ref Missing, ref Missing, ref Missing);
WordDoc.Close(ref Missing, ref Missing, ref Missing);
WordApp.Quit(ref Missing, ref Missing, ref Missing);
}
catch(Exception Ex)
{
throw new Exception(Ex.Message);
}
//浏览器弹出下载框
Page.RegisterStartupScript("", "<script>window.open('"+newFileName+"')
</script>");
}
运行前,工程目录下建文件夹doc, doc里新建一个test.doc,内容自己定,手动
插入一个名为“Title”的标签。
此代码在 VS.Net2003+WinXP+Office2007 下运行通过。
如果你在运行时出现下面的调试错误:

拒绝访问。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了
解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.UnauthorizedAccessException: 拒绝访问。
ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源
的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS
5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过
<identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为
IUSR_MACHINENAME)或经过身份验证的请求用户。
若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属
性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示
ASP.NET 帐户,选中所需访问权限对应的框。

出现以上错误时,表明ASP.NET进程无法对具有用户界面的Word进行自动化调用,
必须由一个拥有桌面的用户角色来启动ASP.NET进程。解决方法:在Web.config文
件的System.Web节里添加<identity impersonate="true" userName="*"
password="*" />,其中userName和password是你电脑里的Windows登录账户。
3. 方案总结
Web服务器端自动化调用Word在实际应用中发现的问题:
一、 开发难易度:Word自动化中的调用都基于VBA语法,需要开发者对VBA很熟悉
。VBA中Word对象众多、逻辑复杂,COM调用方式难于理解。一般开发者很少接触
VBA和COM,因此开发起来比较麻烦。
二、 代码安全性:上述运行错误“拒绝访问”的最佳解决方法就是添加<identity
impersonate="true" userName="*" password="*" />,不过缺点是在Web.config
里可以看到你的账户密码,尽管Web.config不会轻易被人下载到,但还是具有一定
的危险性。另外也可以运行Dcomcnfg.exe工具提升ASPNET账户权限为交互式用户,
当然这样也会增加服务器的风险。网上搜索发现有网友的解决方法是:在.net 安
装根目录下找到config文件夹下的machine.config文件将processModel 中的
username属性改为SYSTEM。还有网友的解决方法是:将IIS默认的账户改为管理员
账户。这两个方法更加危险,一旦黑客获得了ASP.Net进程的权限,他就能完全控
制你的服务器。
三、 运行稳定性:微软Office是主要针对普通用户开发的桌面办公应用软件,它
具有丰富的UI(用户界面)元素,是一套纯粹的本地运行软件或者说是客户端软件
。Word自动化接口主要是为了方便窗口应用程序调用而设计的。例如Delphi、VB、
C# Winform等开发的本地应用程序。虽然可以强制Visible为false,Word可以运行
在服务器端代码里,但毕竟还是会带来许多棘手问题。1. ASP.NET是基于B/S架构
的。B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务
器页面发出请求。在这种情况下Word自动化调用会时常出现死进程。2. 由于隐藏
界面运行,一些涉及界面的可以在窗口程序里成功调用的接口,在服务器端调用就
会失败,甚至崩溃,这种情况也会经常导致死进程。3. 由于Word是复杂的桌面程
序,并不符合一般Web服务程序简洁高效的标准,所以在服务器端运行时速度慢,
并且还会消耗大量资源(CPU、内存),尤其不能支持大量用户同时访问,资源会很
快耗尽。4. 绝大部分开发者对COM技术比较陌生,在编程调用Word接口时经常存在
一些代码错误,而又很难检查到问题所在,这又是导致死进程的经常因素。Word死
进程不仅会消耗服务器资源,还经常会导致服务器页面不能创建新的Word自动化对
象而无法继续工作。有网友提出死进程解决方法:编程Kill掉Word死进程,这样是
治标不治本的做法,Word死进程是不在了,可是Word非正常关闭会导致很多资源无
法及时释放。这样的Web服务器能持续工作多久恐怕就很难说了。
既然在Web服务器端自动化调用Word存在这么多问题,那么能不能在客户
端浏览器里调用Word呢?用JavaScript肯定可以,不过要想运行就得把浏览器的安
全性降到最低,呵呵,恐怕没有几个用户愿意这么做啊。即使不存在安全问题,本
来写在服务器端的代码逻辑要写在JavaScript里,由此带来的大量麻烦(打开、传
值、取值、保存到服务器等)也会让人难以容忍。
4. 解决方案
为了解决这些问题,笔者经过全面研究比较,发现网上有一款软件
SOAOffice(微软Office专用Web中间件),完全消除了以上问题,推荐给大家分享

经研究发现,SOAOffice是一套由服务器端组件和客户端控件构成的中间
件系统。服务器端组件是标准.NET组件,提供简洁高效的Word、Excel简化接口;
客户端控件在浏览器网页里运行。服务器端调用SOAWord.WebOpen打开文档后,浏
览器页面里客户端控件会启动客户机上的Word并且运行在网页里而不是本地打开。
服务器端无需安装Office软件。
SOAOffice的架构很巧妙,开发者只需关注服务器端编程逻辑,客户端如
何工作都交由控件自动完成。SOAOffice充分利用了分布式计算的思想,把本来要
在服务器端运行的Word运算量交给了客户机。也就是说,原来采用服务器端自动化
技术的网页同时要处理N个Word任务现在交给了N个客户机,每个客户机运行一个
Word。服务器只需处理需要服务器处理的业务逻辑,一切与界面有关、与Word程序
本身有关的工作由客户机运行,当然这也是客户机的强项。
SOAOffice的架构消除了服务器端运行Word、Excel的风险,又充分利用了
客户机闲置的计算资源,这种架构不但解决了ASP、ASP.NET等Windows web服务调
用Word、Excel的问题,而且还给Java写的Web服务调用Word、Excel提供了解决方
案(Unix、linux等无法自动化Word、Excel)。
SOAOffice能够让用户直接在网页里看到word文件内容,并且可以直接编
辑、保存回Web服务器,给用户省去了先下载下来,修改完后再上传的麻烦。
SOAOffice还有其他更多自动化调用Word无法做到的强悍功能,比如只读
、防下载、防复制等,你就下载一个慢慢琢磨吧。
附上利用 SOAOffice 完成本实例相同功能 + 只读防下载功能的代码:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
SOAOfficeX.WordResponse SOAWord = new SOAOfficeX.WordResponse();
//对数据区域"Title"进行填充
SOAWord.OpenDataRegion("Title").Value = "公文标题";
SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl();
// 设置界面样式
SOACtrl.MainStyle = SOAOfficeX.soaMainStyle.VistaBlue;
SOACtrl.Caption = "动态生成文档";
SOACtrl.Menubar = false;
SOACtrl.Toolbars = false;
SOACtrl.CanCopy = false;//禁止下载、复制粘贴等
// 获取数据对象
SOACtrl.Assign(SOAWord);
// 只读打开生成的文档
SOACtrl.WebOpen("doc/test.doc", SOAOfficeX.soaWorkMode.docReadOnly,
"SomeBody", "Word.Document");
}
子夜__ 2011-08-30
  • 打赏
  • 举报
回复

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧