什么是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

Open Xml SDK 引文的更多相关文章

  1. Open Xml SDK Word模板开发最佳实践(Best Practice)

    1.概述 由于前面的引文已经对Open Xml SDK做了一个简要的介绍. 这次来点实际的——Word模板操作. 从本质上来讲,本文的操作都是基于模板替换思想的,即,我们通过替换Word模板中指定元素 ...

  2. User Word Automation Services and Open XML SDK to generate word files in SharePoint2010

    SharePoint 2010 has established a new service called "Word Automation Services" to operate ...

  3. Csharp: create word file using Open XML SDK 2.5

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. Csharp: read excel file using Open XML SDK 2.5

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 下载和编译 Open XML SDK

    我们需要一些工具来开始 Open XML 的开发. 开发工具 推荐的开发工具是 Visual Studio 社区版. 开发工具:Visual Studio Community 2013 下载地址:ht ...

  6. Open XML SDK 在线编程黑客松

    2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的 ...

  7. Embedding Documents in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office

    Download the sample code This visual how-to article presents a solution that creates a Word 2007 doc ...

  8. 【转】Open XML SDK class structure

    Open XML SDK class structure March 27, 2012 by Vincent I’ve gotten a few questions on the class stru ...

  9. 使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink

    使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink 原理 先创建一个包括全部EXCEL单元格中超链接Hyperlink数据的表,再定位单元格通过列头(如A1,B1)获取超链接信息 ...

随机推荐

  1. cocos基础教程(13)使用Physicals代替Box2D和chipmunk

    1.   概述 游戏中模拟真实的世界是个比较麻烦的事情,通常这种事情都是交给物理引擎来做.首屈一指的是Box2D了,它几乎能模拟所有的物理效果.而chipmunk则是个更轻量的引擎,能够满足简单的物理 ...

  2. XSS的DOS攻击之 server limit dos

    墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...

  3. 我们为之奋斗过的C#-----Bank系统

    首先感谢大家抽出宝贵的时间来看这个Bank系统,这是我最近学的Bank系统,你们看我刚一学完就给你们分享了我的所学以及学习的一些经验,所以大家一定要耐心看下去,真的你会有所收获的,不信你看看.下面话不 ...

  4. HDU 1029 Ignatius and the Princess IV

    解题报告: 题目大意:就是要求输入的N个数里面出现的次数最多的数是哪一个,水题.暴力可过,定义一个一位数组,先用memset函数初始化,然后每次输入一个数就将下标对应的上标对应的那个数加一,最后将整个 ...

  5. L17 怎么向应用程序商店提交应用

    原地址:https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOS/ApplicationD ...

  6. UIView中UIButton设置监听

    红色框框是一个uibutton _priceValueLabel是他的父视图, 必须要把button的父视图设置userInteractionEnabled = YES, button的 监听才会生效 ...

  7. 【Python】使用 boto 调用 S3 对象存储API

    代码示例: import logging #from django.conf import settings import boto from boto.s3.key import Key impor ...

  8. SQL Server游标的使用

    转: http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集 ...

  9. [MySQL] - MySQL的Grant命令

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  10. oracle、mysql、sybase和sqlserver复制表结构和数据

    Sql Server(sybase): 1.复制表结构: 新建表student2,并且结构同表syn_xj_student一致.Sql语句如下: 2.复制表数据,并排除俩表中相同的数据: insert ...