什么是Open Xml SDK?

什么是Open Xml?

首先,我们得知道,Open Xml为何物?

我们还是给她起个名字——就叫 “开放Xml”,以方便我们中文的阅读习惯。之所以起开放这个名字,因为以前有接触过Open Authorization,可以称为开放授权,比如OpenID之类的。

“Open XML标准的简单介绍:Ecma Office Open XML(“Open XML”)是针对字处理文档、演示文稿和电子表格的国际化开放标准,可免费供多个应用程序在多个平台上实现。Microsoft Office(2007、2003、XP、2000)、OpenOffice Novell Edition、开源项目 Gnumeric、Neo-Office 2.1 和 PalmOS (Dataviz) 已经支持 Open XML。Corel 已经宣布在 WordPerfect 2007 中提供 Open XML 支持,全球的开发人员正在使用 OpenXML 构建解决方案。

Open XML 的标准化工作是由 Ecma International 通过其技术委员会 45 (TC45) 执行的,来自 Apple、Barclays Capital、BP、The British Library、Essilor、Intel、Microsoft、NextPage、Novell、Statoil、Toshiba 和 United States Library of Congress 的代表参与了该项工作。该标准旨在提供现有 ISO 标准所无法提供的独特好处,其中包括能够实现从现有二进制格式向基于 XML 的格式的高保真移植。”

什么是Open Xml SDK?

顺理成章,Open XML SDK特指微软Office的开放XML,且提供了一套操作的SDK组件。

故而,我们的关注点也就停留在微软的Word,PPT,Excel这三个产品上。

这样,我们就可以做很多事情了,如:查找替换,创建图形,分析数据,移动幻灯片等等,你能够想得到的Office操作,都可以用Code给表达出来,就看你有多大Power。

怎样获得?

这是个必备的内容。

首先,作为一个文档的完整性需要,是必备的;

其次,我想卖弄一下我知道的资源获取方式;

所以,我还是厚着脸皮地使之流水账:

1)MSDN下载;http://www.microsoft.com/en-us/download/details.aspx?id=5124

2)我的百度云盘:http://pan.baidu.com/s/1c0iYgxU 密码:r8yl;

3)Nuget:Install-Package DocumentFormat.OpenXml;

4)VS:工具——>扩展和更新,选择联机——>输入openxml,即可安装。

怎样装配开发环境?

只需引入如下程序集即可:

1)DocumentFormat.OpenXml

2)WindowsBase

怎样理解SDK?

数据结构

之所以起用“数据结构”这四个字,表明将要突出的是重点。

SDK是用来操作XML的,且XML是用树形结构组织。”(是否想到了DOM树,Jquery的查询化API,.NET中XML命名空间,Linq To XML,组合模式。。。。。。)

1)首先,由于WORD,PPT,EXCEL都可以表示为XML文件,或者XML Package,所以,我们必须熟悉XML标记语言(ML)的语法,如元素,属性,文本,根等。

代码角度:联系你自己编程语言中的,操作XML的API。

2)其次,XML是树形的,那么据此推测SDK中,要么提供能够操作XML API,要么调用一般的XML API。SDK选择了前者。

SDK 揭秘

基于SDK本质上就是对树的访问的理由,我们有必要关注几个特殊的类:

OpenXmlElement

摘要:Represents a base class that all elements in an Office Open XML document derive from.

它的作用即为所有元素的一种抽象,如果去掉了Open,就变成了XmlElement,熟悉Xml的你,是否会想起什么?

其提供了大量的关于XML的API,将XML内联化:

InnerText,InnerXml,HasChildren,LastChild,Ancestors,Elements<T>,ElementsAfter,RemoveChild<T>等等。

OpenXmlCompositeElement

摘要:Represents the base class for composite elements.

同样地,提供了大量的操作XML的API:

public override T AppendChild<T>(T newChild);

public override T InsertAfter<T>(T newChild, OpenXmlElement refChild);

public override T InsertAt<T>(T newChild, int index);

public override T InsertBefore<T>(T newChild, OpenXmlElement refChild);

public override T PrependChild<T>(T newChild);

public override void RemoveAllChildren();

public override T RemoveChild<T>(T oldChild);

public override T ReplaceChild<T>(OpenXmlElement newChild, T oldChild);

WordprocessingML中的很多元素皆从其派生,如:

Paragraph

Table

Run

OpenXmlLeafElement与OpenXmlLeafTextElement

OpenXmlLeafElement摘要:Represents the base class from which leaf elements are derived.

OpenXmlLeafTextElement摘要:Represents the base class from which leaf elements that have text are derived.

其中,带文本的叶子元素从叶子元素派生。如:WordprocessingML中的Text

怎样使用SDK?

到这里,我不想继续枚举SDK内部的类与摘要,那是很枯燥的事情。

因为OpenXmlElement,OpenXmlCompositeElement,OpenXmlLeafElement与OpenXmlLeafTextElement,已足够覆盖其面貌。

Eg:使用的代码片段:查找某个表格,并按照格式插入一行。

[Test]
public void Usage_Test()
{
using (WordprocessingDocument wordprocessingDocument =
WordprocessingDocument.Open(@"F:\数据报告模板.docx", true))
{
// Assign a reference to the existing document body.
Body body = wordprocessingDocument.MainDocumentPart.Document.Body; var table = body.Elements<Table>().ElementAt(); //查找某表
var row = table.Elements<TableRow>().ElementAt().Clone() as TableRow; //复制某行
var cells = row.Elements<TableCell>(); //所有Cell
List<string> list = new List<string>() { "pz", "", "dn", "" };
//假设为四列表格
for (int ii = ; ii < ; ii++)
{
var cell = cells.ElementAt(ii); Paragraph tmpPa = cell.Elements<Paragraph>().FirstOrDefault();
var tmpRun = tmpPa.Elements<DocumentFormat.OpenXml.Wordprocessing.Run>().FirstOrDefault();
var tmpText = tmpRun.Elements<DocumentFormat.OpenXml.Wordprocessing.Text>().FirstOrDefault();
Console.WriteLine(tmpText.Text);
tmpText.Text = list[ii]; //Update
} var lastRow = table.Elements<TableRow>().Last();
table.InsertAfter<TableRow>(row, lastRow);
}
}

参考文献

SDK MSDN教程(Official,首选。请注意左侧的三个子菜单:”入门”、”了解Open XML格式”、”如何实现…”):http://msdn.microsoft.com/zh-cn/library/bb448854(v=office.14).aspx

http://msdn.microsoft.com/zh-cn/library/gg278308(v=office.14).aspx

http://msdn.microsoft.com/zh-cn/library/cc850837(v=office.14).aspx

OPEN XML 百度百科 简介:

http://baike.baidu.com/view/1201978.htm

博客相关文章(待你去考证):

http://www.cnblogs.com/weu135/archive/2013/03/31/2991565.html

http://www.cnblogs.com/xuanhun/archive/2011/05/31/2065024.html

http://blog.csdn.net/francislaw/article/details/7568317

最新文章

  1. QT数据库连接的几个重要函数的使用及注意事项(原创)
  2. Ubuntu下Apache+SVN+submin实现WEB管理SVN
  3. JDBC、JTA、Spring的事务管理
  4. Java并发和多线程(一)基础知识
  5. 二、JavaScript语言--JS基础--JavaScript入门篇
  6. Oracle基础 动态SQL语句
  7. 如何在Linux上安装Tomcat
  8. 【学习总结】OS X , IOS , IOS SDK , XCode之间的关系
  9. [转载]如何重装Grub,使其可以引导双系统
  10. 系统的了解DJANGO中数据MODULES的相关性引用
  11. Nginx Resource
  12. 如何判断MSSQL数据库磁盘出现了瓶颈
  13. log实例
  14. 基于Jquery的多彩二维码的生成
  15. 总结OpenWrt系统基本操作方法
  16. Windows下配置node和npm
  17. 2D 加速图形界面开发源代码亲写 想买来学习得加qq 313244484 20万当前代码,完整400万包写完
  18. Python股票分析系列——基础股票数据操作(二).p4
  19. mysql5.7一键安装脚本
  20. C++ STL 数据结构与算法 —— 排序

热门文章

  1. google推出的SwipeRefreshLayout下拉刷新用法
  2. 淘宝(阿里百川)手机客户端开发日记第三篇 SlidingPaneLayout实现侧滑菜单
  3. [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
  4. Vector3.Lerp 插值
  5. 消息通信库ZeroMQ 4.0.4安装指南
  6. Nmap备忘单:从探索到漏洞利用 Part1
  7. lz4,pigz,gzip 3者比较
  8. 如何解决Eclipse启动时画面一闪而过
  9. 《ASP.NET1200例》实现投票的用户控件
  10. Java用Scanner类获取用户输入