有的时候我们需要在程序中处理Word文档比如删除或替换掉文档中的某些字符串实现这个功能有很多方法我这里介绍一种方法个人认为其效率要优于其它方法但本方法目前只适用于office 中的ExcelWord PowerPoint 下面引用一些msdn上关于office 的介绍 Microsoft Office system为Microsoft Office Excel Microsoft Office Word 和Microsoft Office PowerPoint 采用了基于XML的文件格式新的格式增强了文件与数据的管理能力数据恢复能力以及与业务线系统的互操作能力它们是对早期版本的二进制文件的扩展任何支持XML的应用程序都可以访问新文件格式当中的数据并与之协同工作这些应用程序并不需要成为Microsoft Office system或Microsoft产品的一部分用户也可以使用标准的转换来提取或重新组织数据另外有关安全性的担忧也大大的降低因为信息是存储在XML当中的它从本质上来讲都是纯文本的因此数据可以没有任何障碍地通过企业防火墙进行传递
注意
不要将Office Open XML格式与Microsoft Windows XML Paper Specification格式相混淆Office Open XML格式使用Open Packaging ConventionsXML Paper Specification (XPS)也使用它但是这两种格式在许多重要的方面是不同的XPS是一个页面内的固定的文档格式它是在Microsoft Windows Vista操作系统当中所引入的而Office Open XML格式是面向Office Word Office Excel 和Office PowerPoint 的完全可编辑的文件格式虽然它们在XML和ZIP压缩的使用方面有很多相似的地方但是它们在文件格式的设计和使用目的上还是有着很大的不同
为了打开一个Word XML文件
创建一个临时目录来存储文件和它的部件
创建一个Word 文档包括文本图片以及其它元素保存为一个docx文件
在文件名的末端添加一个zip扩展名
双击文件这时将会在ZIP应用程序当中打开该文件您可以查看组成文件的每个部件(可以不用winrar压缩工具打开以windows默认的zip格式打开)
将这些部件提取到刚才创建的临时目录当中
这时就可以看到组成docx文件的所有XML格式的文件这里需要大家详细阅读一下我上面给的链接的内容现在我主要介绍一下在net中处理word()文档的一种方法需要说明的是在net frameword 中并没有提供相关的类来处理zip格式的文件在net framework 中提供了一个类Package所属的命名空间为SystemIOPackaging因此在本例中要实现对word文档的处理必须安装net frameword 或者 在引用中要添加对WindowsBasedll的引用这个DLL文件在windows 系统里位于C:\Program Files\Reference Assemblies\Microsoft\Framework\v\目录下
我做的这个例子是替换Word页脚中的链接将http://wwwgooglecn/ 替换为http://wwwcnblogscom/其它的处理可以用类似的方法来操作下面是代码:
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemIO;
using SystemIOPackaging;
namespace WordProcess
{
class Program
{
static void Main(string[] args)
{
string filePath = testdocx;
string content = null;
string contentType;
CompressionOption option;
PackageRelationshipCollection relations;
try
{
//打开docx文件
using (Package zip = SystemIOPackagingPackageOpen(fileZip FileModeOpenOrCreate FileAccessReadWrite))
{
foreach (PackagePart part in zipGetParts())
{
//寻找页脚所在的文件
if (partUriOriginalString == /word/footerxml)
{
StreamReader sr = new StreamReader(partGetStream());
content = srReadToEnd();
//替换内容
if (content != null)
content = contentReplace(http://wwwgooglecn http://wwwcnblogscom);
srClose();
contentType = partContentType;
option = partCompressionOption;
relations = partGetRelationships();
//删除 footerxml
zipDeletePart(partUri);
//创建一个新的 footerxml
Uri tempUri = PackUriHelperCreatePartUri(new Uri(/word/footerxml UriKindRelative));
PackagePart tempPart = zipCreatePart(tempUri contentType option);
//将修改后的 footerxml
using (StreamWriter sw = new StreamWriter(tempPartGetStream()))
{
swWrite(content);
swFlush();
swClose();
}
//创建tempart与各XML文件之间的关系非常重要
foreach (PackageRelationship relation in relations)
{
tempPartCreateRelationship(relationTargetUri relationTargetMode relationRelationshipType relationId);
}
zipClose();
break;
}
}
}
}
catch (Exception ex)
{
throw new Exception(exMessage);
}
}
}
}
以上代码复制后可以直接运行只需在debug目录下创建一个word()文档并插入页脚当然也可以更改一下代码里的设置 该方法同样适用于Microsoft Office Excel 和Microsoft Office PowerPoint 利用这种方法可以实现以操作XML文件的方式对以上三种文档进行操作比如去掉文档中的写保护替换或删除部分内容等此方法占用内存少执行效率也比较高 第一次想把文章放到首页不足之处请大家指教一定改正!