什么是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. cocos2dx 安卓编译问题收集

    问题: 新的cocos2d-x 2.2.5 在使用Eclipse的安卓NDK 9 的编译器进行编译的时候,问题提示如下: [armeabi] Compile++ thumb: cocos_extens ...

  2. [Effective JavaScript 笔记]第50条:迭代方法优于循环

    "懒"程序员才是好程序员.复制和粘贴样板代码,一但代码有错误,或代码功能修改,那么程序在修改的时候,程序员需要找到所有相同功能的代码一处处进行修改.这会使人重复发明轮子,而且在别人 ...

  3. 安装 openSUSE Leap 42.1 之后要做的 8 件事

    导读 openSUSE Leap 确实是个巨大的飞跃,它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版.和其它系统一样,为了实现最佳的使用效果,在使用它之前需要做些优化设置. 下 ...

  4. 极客教学:如何使用树莓派击落&劫持无人机

    本教程的目的是帮助大家理解如何研究未受保护的无线通信的安全风险所在,同时我们希望大家不要对技术进行滥用.我们这里采用的例子是一个流行的无人机模型:Parrot AR.Drone 2.0. 四轴无人机能 ...

  5. 暑假热身 E. 无聊的LSY

    LSY大牛没事就爱玩游戏,包括很多很无聊的游戏.某日,LSY大牛又找到了一个无聊的游戏:每一局游戏的开始,LSY大牛将代表自己的棋子放在一个线性棋盘的最左端(第0个格子,可以认为向右端无限延伸),接着 ...

  6. django 架构点点滴滴

    前言: 零星发现一些,零星记录一些,因此可能整体比较混乱,因为显然不是一气呵成写的. 关于CBV(Class Based View): 首先吐槽下,cbv的整体继承结构,可真的不是很优美,可以查看这里 ...

  7. 【云计算】docker registry v2简介

    ubuntu docker方式部署docker registry v2 2016-03-03 17:36 by JackieHan, 4 阅读, 0 评论, 收藏,  编辑 生成自己签名的证书 生成签 ...

  8. iOS 第三方自定义Alertview项目MBProcessHud中的重要代码分析

    做ios,弹出一个自定义的alertview挺常见的.ios7以前,我们可以对系统的UIAlertView进行一点操作,实现一点简单的定制,但是ios7不再允许我们这样做了.因此,我们需要自己创建一个 ...

  9. JDBC的基本步骤

    JDBC全名是Java Data Base Connectivity就是Java数据库连接,这是Java用于向数据库执行SQL语句的API,JDBC可以为多种关系型数据库提供统一的访问,而不用考虑细节 ...

  10. Java for LeetCode 160 Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...