频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

.Net中处理Word 2007文档的一种方法

来源:博客园 作者:qiangzi 出处:巧巧读书 2008-05-22 进入讨论组

有的时候我们需要在程序中处理Word文档,比如,删除或替换掉文档中的某些字符串,实现这个功能有很多方法,我这里介绍一种方法,个人认为其效率要优于其它方法,但本方法目前只适用于office 2007 中的Excel,Word,

PowerPoint. 下面引用一些msdn上关于office 2007的介绍. 2007 Microsoft Office system为Microsoft Office Excel 2007,Microsoft Office Word 2007,和Microsoft Office PowerPoint 2007采用了基于XML的文件格式,新的格式增强了文件与数据的管理能力,数据恢复能力,以及与业务线系统的互操作能力。它们是对早期版本的二进制文件的扩展。任何支持XML的应用程序都可以访问新文件格式当中的数据,并与之协同工作。这些应用程序并不需要成为Microsoft Office system或Microsoft产品的一部分。用户也可以使用标准的转换来提取或重新组织数据。另外,有关安全性的担忧也大大的降低,因为信息是存储在XML当中的,它从本质上来讲都是纯文本的。因此,数据可以没有任何障碍地通过企业防火墙进行传递。

注意:

不要将Office Open XML格式与Microsoft Windows XML Paper Specification格式相混淆。Office Open XML格式使用Open Packaging Conventions,XML Paper Specification (XPS)也使用它。但是,这两种格式在许多重要的方面是不同的。XPS是一个页面内的,固定的文档格式,它是在Microsoft Windows Vista操作系统当中所引入的。而Office Open XML格式是面向Office Word 2007,Office Excel 2007,和Office PowerPoint 2007的完全可编辑的文件格式。虽然它们在XML和ZIP压缩的使用方面有很多相似的地方,但是它们在文件格式的设计和使用目的上还是有着很大的不同。

为了打开一个Word 2007 XML文件

1、创建一个临时目录来存储文件和它的部件。
2、创建一个Word 2007文档,包括文本,图片,以及其它元素,保存为一个.docx文件。
3、在文件名的末端添加一个.zip扩展名。
4、双击文件。这时将会在ZIP应用程序当中打开该文件。您可以查看组成文件的每个部件。(可以不用winrar压缩工具打开,以windows默认的zip格式打开)
5、将这些部件提取到刚才创建的临时目录当中。

这时就可以看到组成docx文件的所有XML格式的文件.这里需要大家详细阅读一下我上面给的链接的内容,现在我主要介绍一下在.net中处理word(2007)文档的一种方法,需要说明的是在.net frameword 2.0 中并没有提供相关的类来处理zip格式的文件,在.net framework 3.0中提供了一个类Package,所属的命名空间为System.IO.Packaging,因此在本例中要实现对word文档的处理必须安装.net frameword 3.0 或者 3.5,在引用中要添加对WindowsBase.dll的引用,这个DLL文件在windows 2003 系统里位于C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\目录下。

我做的这个例子是替换Word页脚中的链接,将http://www.google.cn/ 替换为http://www.cnblogs.com/。其它的处理可以用类似的方法来操作。下面是代码:

1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5using System.IO.Packaging;
6
7namespace WordProcess
8{
9    class Program
10    {
11        static void Main(string[] args)
12        {
13            string filePath = "test.docx";
14            string content = null;
16
17            string contentType;
18            CompressionOption option;
19            PackageRelationshipCollection relations;
20
21            try
22            {
23               
25                //打开docx文件
26                using (Package zip = System.IO.Packaging.Package.Open(fileZip,

FileMode.OpenOrCreate, FileAccess.ReadWrite))
27                {
28
29                    foreach (PackagePart part in zip.GetParts())
30                    {
31                        //寻找页脚所在的文件
32                        if (part.Uri.OriginalString == "/word/footer2.xml")
33                        {
34                            StreamReader sr = new StreamReader(part.GetStream());
35                            content = sr.ReadToEnd();
36                            //替换内容
37                            if (content != null)
38                                content = content.Replace("http://www.google.cn",

"http://www.cnblogs.com");
39                            sr.Close();
40
41                            contentType = part.ContentType;
42                            option = part.CompressionOption;
43                            relations = part.GetRelationships();
44
45                            //删除 footer2.xml
46                            zip.DeletePart(part.Uri);
47
48                            //创建一个新的 footer2.xml
49                            Uri tempUri = PackUriHelper.CreatePartUri(new Uri

("/word/footer2.xml"

, UriKind.Relative));
50                            PackagePart tempPart = zip.CreatePart(tempUri,

contentType, option);
51
52                            //将修改后的 footer2.xml
53                            using (StreamWriter sw = new StreamWriter(tempPart.GetStream()))
54                            {
55                                sw.Write(content);
56                                sw.Flush();
57                                sw.Close();
58                            }
59
60                            //创建tempart与各XML文件之间的关系,非常重要
61                            foreach (PackageRelationship relation in relations)
62                            {
63                                tempPart.CreateRelationship(relation.TargetUri, relation.

TargetMode, relation.RelationshipType, relation.Id);
64                            }
65
66                            zip.Close();
67
68                            break;
69                        }
70                    }
73                }
74            }
75            catch (Exception ex)
76            {
77                throw new Exception(ex.Message);
78            }
79        }
80    }
81}
82

以上代码复制后可以直接运行,只需在debug目录下创建一个word(2007)文档,并插入页脚,当然也可以更改一下代码里的设置. 该方法同样适用于Microsoft Office Excel 2007和Microsoft Office PowerPoint 2007,利用这种方法可以实现以操作XML文件的方式对以上三种文档进行操作,比如去掉文档中的写保护,替换或删除部分内容等.此方法占用内存少,执行效率也比较高。

更多文章 更多内容请看数据库处理专题.NET移动与嵌入式技术.NET开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章