一、 OFFICE OPEN XML 简介
Office Open XML (OpenXML) 是一项针对字处理文档、演示文稿和电子表格的建议开放标
准,可由多个应用程序在多个平台上自由地实施。不管是要实施支持该格式的应用程序
的组织、采购此类软件的商业实体和政府实体还是从事该格式教学的教育者或作家,都
会因这种标准的发布而获益。最终,所有用户都可以享受“所有文档,一种 XML 标准”
所带来的好处,包括稳定性、持久保存性、互操作性和正在进行的其他改进。
OpenXML 的标准化工作是由 Ecma International 通过其 Technical Committee 45(技术委员
会 45,TC45)执行的,来自 Apple、Barclays Capital、BP、英国国家图书馆 (The British
Library)、Essilor、Intel、Microsoft、NextPage、Novell、Statoil、Toshiba 和美国国会图书馆
(United States Library of Congress) 的代表参与了该项工作随着20世纪90年代XML的出现,企业计算客户开始逐渐认识到,在他们所依赖的计算机产品和应用中
采用开放的格式和标准所带来的商业价值。IT专业人员将从通用的数据格式中受益匪浅,这种格式可
能是XML,因为它拥有被应用程序、平台和Internet浏览器读取的能力。
同样,随着在Microsoft Office 2000中对于XML格式的支持与采用,开发人员开始认识到,他们需要将以前的Microsoft Office版本中的二进制文件格式转换为XML格式。二进制文件(.doc,.dot,.xls,以及.ppt文件)在过去几年中一直肩负着存储和转换数据的重任,而现在它们无法满足新的市场需求的挑战,其中
包括轻松地在异构应用之间传递数据,以及允许用户从这些数据中搜集商业信息。
2007 Microsoft Office system为Microsoft Office Excel 2007,Microsoft Office Word 2007,和Microsoft Office PowerPoint 2007采用了基于XML的文件格式,从而延续了这种转移。新的文件格式,称为Office Open XML格式,解决了上述市场需求的问题,同时改变了您基于Microsoft Office文档建立解决方案的方式。
新的格式增强了文件与数据的管理能力,数据恢复能力,以及与业务线系统的互操作能力。它们是对早期版本的二进制文件的扩展。任何支持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压缩的使用方面有很多相似的地方,但是它们在文件格式的设计和使用目的上还是有着很大的不同。
新的文件格式的容器是基于简单的分部分的压缩的ZIP文件格式。在新的Office Open XML格式的核心使用一些XML的引用架构和一个ZIP容器。每个文件都是由一些部件的集合组成的;这个集合定义了文档。
文档部件是存储在容器文件当中,或者存储在基于工业标准的ZIP格式的包中。许多部件都是用来描述应用程序数据,元数据,以及自定义数据的XML数据,它们都是存储在容器文件当中的。其它非XML部件,也可以包含在容器包当中,其中包括在文档中表示图片或者嵌入的OLE对象的二进制文件。另外,还有一些关系部件,它们指定了部件之间的关系;这种设计方式为Office文件提供了结构。部件组成了文件的内容,而关系描述了这些内容如何组织在一起。
Office文档的XML文件格式紧密的集成在一起,但是它们是模块化的,并且具有高度的灵活性。在下面的一些章节中,详细地描述了Office XML格式的每个组成部分。它们也使用新的文件格式描述了Office应用程序。
注意:
为了理解一个Office XML格式文件的组成,您可以希望提取一个文件。为了打开文件,您可以使用一个ZIP应用程序,例如将WinZip(来自WinZip Computing Corporation)安装到您的计算机当中。
二、 asp.net操作OpenXML文档
如果确定ASP .NET应用程序仅处理Office 2007生成的OpenXML格式文档,那么使用OpenXML SDK是一个更好的主意,因为它不需要在服务器上安装Office,对客户端也没有任何要求,只要用的是OpenXML格式的文档就可以了。因为OpenXML格式已提交国际标准化组织,所以,用户可以使用支持OpenXML的任何应用程序读取和编辑该文档。
使用该方案需要下载OpenXML SDK,并使用其进行开发,目前该SDK还只是一个CTP版本。下面的代码演示了如何使用OpenXML SDK读写OpenXML格式的Excel文件:
//怎样获取WorkSheet信息
public List<string>XLGetSheetInfo(string fileName)
{
//用所有的sheet添充这个集合
List<string>sheets=new List<string>();
using(SpreadsheetDocument xlPackage=SpreadsheetDocument.Open(fileName,false))
{
WorkbookPart workbook=xlPackage.WorkbookPart;
Stream workbookstr=workbook.GetStream();
XmlDocument doc=new XmlDocument();
doc.Load(workbookstr);
XmlNamespaceManager nsManager=new XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace("default",doc.DocumentElement.NamespaceURI);
XmlNodeList nodelist=doc.SelectNodes("//default:sheets/default:sheet",nsManager);
foreach(XmlNode node in nodelist)
{
string sheetName=string.Empty;
sheetName=node.Attributes/["name"/].Value;
sheets.Add(sheetName);
}
}
return sheets;
}
//怎样为一个Excel文档创建一个新的包
public static void CreateNewExcelDocument(string document)
{
using(SpreadsheetDocument
xcelDoc=SpreadsheetDocument.Create(document,preadsheetDocumentType.Workbook))
{
//设置文档内存以便Excel能够打开
WorkbookPart mainPart=excelDoc.AddWorkbookPart();
SetMainDocumentContent(mainPart);
}
}
//设置主文档部分内存
public static void SetMainDocumentContent(WorkbookPart part,string excelXml)
{
using(Stream stream=part.GetStream())
{
byte/[/]buf=(new UTF8Encoding()).GetBytes(docXml);
stream .Write(buf,0,buf.Length);
}
}
三、asp.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://blog.csdn.net/.其它的处理可以用类似的方法来操作.下面是代码:using System; using System.Collections.Generic; using System.Text; using System.IO; using System.IO.Packaging; namespace WordProcess { class Program { static void Main(string[] args) { string filePath = "test.docx"; string content = null; string contentType; CompressionOption option; PackageRelationshipCollection relations; try { //打开docx文件 using (Package zip = System.IO.Packaging.Package.Open(fileZip, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { foreach (PackagePart part in zip.GetParts()) { //寻找页脚所在的文件 if (part.Uri.OriginalString == "/word/footer2.xml") { StreamReader sr = new StreamReader(part.GetStream()); content = sr.ReadToEnd(); //替换内容 if (content != null) content = content.Replace("http://www.google.cn", http://blog.csdn.net); sr.Close(); contentType = part.ContentType; option = part.CompressionOption; relations = part.GetRelationships(); //删除 footer2.xml zip.DeletePart(part.Uri); //创建一个新的 footer2.xml Uri tempUri = PackUriHelper.CreatePartUri(new Uri("/word/footer2.xml", UriKind.Relative)); PackagePart tempPart = zip.CreatePart(tempUri, contentType, option); //将修改后的 footer2.xml using (StreamWriter sw = new StreamWriter(tempPart.GetStream())) { sw.Write(content); sw.Flush(); sw.Close(); } //创建tempart与各XML文件之间的关系,非常重要 foreach (PackageRelationship relation in relations) { tempPart.CreateRelationship(relation.TargetUri, relation.TargetMode, relation.RelationshipType, relation.Id); } zip.Close(); break; } } } } catch (Exception ex) { throw new Exception(ex.Message); } } } }