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

有的时候我们需要在程序中处理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压缩的使用方面有很多相似的地方,但是它们在文件格式的设计和使用目的上还是有着很大的不同。
更详细的信息请参考:http://www.microsoft.com/china/msdn/library/office/office/OfficeOpenXMLFormats.mspx?mfr=true

为了打开一个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文件的方式对以上三种文档进行操作,比如去掉文档中的写保护,替换或删除部分内容等.此方法占用内存少,执行效率也比较高. 第一次想把文章放到首页,不足之处,请大家指教,一定改正!


今天是全国哀悼日,向在汶川地震中遇难的同胞致敬,祝你们在天堂幸福!

 

posted @ 2008-05-19 11:25  gaoyang0303  阅读(2723)  评论(6编辑  收藏  举报