前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >dotnet OpenXML 的 Slide Master 和 Slide Layout 是什么

dotnet OpenXML 的 Slide Master 和 Slide Layout 是什么

作者头像
林德熙
发布2020-07-07 15:09:39
7760
发布2020-07-07 15:09:39
举报
文章被收录于专栏:林德熙的博客林德熙的博客

本文来告诉大家在解析 PPT 文档的时候,元素继承以及占位符需要用到的 Slide Master 和 Slide Layout 是什么

在做 Office 解析的时候,小伙伴需要特别的去学习一下 Office 哦,不然有很多概念将会难以理解。而 Office 有多强?光属性定义加上注释的 C# 代码文件就有 15M 这么多

基本上所有市面上的解析 Office 的软件都只是实现很少的一部分功能…… 包括 WPS 在内

回到主题,咱今天来聊聊 OpenXML 的 PPTX 文件的 Slide Master 和 Slide Layout 是什么。在开始之前期望小伙伴了解 PPT 的模版和占位符的作用,是真的需要小伙伴去学一下的哦。按照程序员的自学速度预计 10 分钟左右就能了解啦

来,先打开最新版本的 PPT 2013 新建一份空白的文档(最新版 2013 哈)实际上使用 2003 以上版本就可以

点击视图的模版

此时你就可以看到第一个大页面就是 Slide Master 页面,后续的每个页面就是 Slide Layout 页面

这里的 Slide Layout 的顺序和页面顺序对应,也就是一个页面对应一个 Slide Layout 页面,而所有页面都对应相同的一个 Slide Master 页面

所有页面的占位符和样式都会优先从页面对应的 Slide Layout 里面获取,如果获取不到就从 Slide Master 获取

在 PPTX 文件里面的存放如下

代码语言:javascript
复制
│  [Content_Types].xml
│
├─DocProps
│      App.xml
│      Core.xml
│      Thumbnail.jpeg
│
├─Ppt
│  │  Presentation.xml
│  │  PresProps.xml
│  │  TableStyles.xml
│  │  ViewProps.xml
│  │
│  ├─HandoutMasters
│  │  │  HandoutMaster1.xml
│  │  │
│  │  └─_rels
│  │          HandoutMaster1.xml.rels
│  │
│  ├─SlideLayouts
│  │  │  SlideLayout1.xml
│  │  │  SlideLayout2.xml
│  │  │
│  │  └─_rels
│  │          slideLayout1.xml.rels
│  │          slideLayout2.xml.rels
│  │
│  ├─SlideMasters
│  │  │  SlideMaster1.xml
│  │  │
│  │  └─_rels
│  │          SlideMaster1.xml.rels
│  │
│  ├─Slides
│  │  │  Slide1.xml
│  │  │
│  │  └─_rels
│  │          Slide1.xml.rels
│  │
│  ├─Theme
│  │      Theme1.xml
│  │      Theme2.xml
│  │
│  └─_rels
│          Presentation.xml.rels
│
└─_rels
        .rels

上面代码需要关注的是 SlideLayouts 和 SlideMasters 的文件

在代码里面可以通过页面获取页面使用的 SlideLayout 和 SlideMaster 使用 OpenXML SDK 不需要自己去处理这部分复杂的逻辑

代码语言:javascript
复制
            using (var presentationDocument =
                PresentationDocument.Open("test.pptx", false))
            {
                var presentationPart = presentationDocument.PresentationPart;
                foreach (var slidePart in presentationPart.SlideParts)
                {
                    var slide = slidePart.Slide;
                    var slideLayoutPart = slidePart.SlideLayoutPart;
                    var slideMasterPart = slideLayoutPart.SlideMasterPart;


                }
            }

获取元素可以使用下面方法

代码语言:javascript
复制
                foreach (var slidePart in presentationPart.SlideParts)
                {
                    var slide = slidePart.Slide;
                    var slideLayoutPart = slidePart.SlideLayoutPart;
                    var slideMasterPart = slideLayoutPart.SlideMasterPart;

                    var textSlideLayout = slideLayoutPart.SlideLayout.Descendants<DocumentFormat.OpenXml.Drawing.Text>().First();
                    Console.WriteLine(textSlideLayout);

                    var textSlideMaster = slideMasterPart.SlideMaster.Descendants<DocumentFormat.OpenXml.Drawing.Text>().First();
                    Console.WriteLine(textSlideMaster);
                }

也就是通过 presentationPart.SlideParts 可以获取所有页面,通过页面的 slidePart.SlideLayoutPart 可以获取对应的 Slide Layout 是哪个,不需要自己去写判断逻辑

通过 slideLayoutPart.SlideMasterPart 可以获取 Slide Master 是哪个,也不需要自己去写判断逻辑

如果依然不懂的话,请下载我放在 github 的代码,然后打开 test.pptx 文件,同时运行代码,看看输出的内容和对应的 PPT 界面显示的文本


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档