什么是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. HTTP长连接短连接

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  2. HTML快速入门4

    七.表单 1. 概述 建立交互式的站点,需要使用 HTML 表单,它可以让用户提供信息,并对此作出处理.可以建立类似 复选框.单选按钮及文本框的控件. 掌握表单的使用对 Active Server P ...

  3. ubuntu14.04安装chrome

    到https://www.google.com/chrome/browser/desktop/index.html可下载指定版本的deb文件. 32bit: wget https://dl.googl ...

  4. 【Python】django多对多 查询 ,反查等操作

    The Django Book中这样写 但我使用属性名后加_set会报错 而直接用members = group.user_group_join.all() 就可以 可能因为我的MyUser类里有两个 ...

  5. 【云计算】基于Ansible的自动部署平台化思路

    目标: 1.自动化—支持命令行.webui.api调用 2.支持基础命令.脚本.复杂任务编排.满足生产环境各类模块自动化部署需求 3.满足生产环境(开发.测试.线上)性能.可靠性.安全性要求 4.流程 ...

  6. javascript 布尔类型值判断

    javascript中,值非null的对象在if()中都会被判断为true: if([]) {// true} if({}) {// true} if(null) {// false} if(&quo ...

  7. iOS UIBezierPath知识介绍

    UIBezierPath是在画图,定制动画轨迹中都有应用. UIBezierPath有许多类方法,能够创建基本的曲线,比如利用一个rect创建一个椭圆path的方法:bezierPathWithOva ...

  8. Price List

    Price List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Tota ...

  9. hdu 1272 小希的迷宫 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 第二条并查集,和畅通工程的解法类似.判断小希的迷宫不符合条件,即有回路.我的做法是,在合并两个集 ...

  10. java获取本机IP地址

    转载自:http://blog.csdn.net/thunder09/article/details/5360251 在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一 ...