zoukankan      html  css  js  c++  java
  • Open Xml SDK 引文

    什么是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(1); //查找某表
            var row = table.Elements<TableRow>().ElementAt(1).Clone() as TableRow; //复制某行
            var cells = row.Elements<TableCell>(); //所有Cell
            List<string> list = new List<string>() { "pz", "0", "dn", "0" };
            //假设为四列表格
            for (int ii = 0; ii < 4; 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

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/pengzhen/p/3811834.html
Copyright © 2011-2022 走看看