在 Office 文档的一些有趣的设计,颜色和画刷是可以继承的,这个继承包括了属性的继承。在形状填充里面使用的渐变色是可以一部分属性放在主题里面,主要找到主题里面的画刷,替换掉形状自己定义的内容,才是形状的画刷

我拿到一份有趣的课件,从这份课件的表现上,可以找到在一个 Shape 元素里面的 ShapeProperties 定义了 GradientFill 属性

// OpenXmlElementList element
var gradientFill = element.First<GradientFill>();

而这个 gradientFill 的 GradientStopList 的值是空

if (gradientFill.GradientStopList != null)
{ }

通过 Office Open XML - DrawingML - Shapes - Gradient Fill 可以知道,这个 GradientStopList 是用来定义渐变的颜色的,也就是这个值是空那么就是渐变将会丢失颜色,也就是形状填充丢失渐变色

从文档上看,形状属性定义里面没有 gsLst 的值

<p:spPr>
<a:xfrm>
<a:off x="611560" y="1059582"/>
<a:ext cx="2120518" cy="645160"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:gradFill flip="none" rotWithShape="1">
<a:lin ang="10800000" scaled="1"/>
<a:tileRect/>
</a:gradFill>
</p:spPr>

也就是 a:gradFill 里面不包含 a:gsLst 的值,也就是没有 a:gs 定义颜色

这个问题是 OpenXML a:gradFill without a:gsLst 渐变色里面没有 GradientStopList 的值

而在这个形状一般都可以看到 ShapeStyle 的值,这个值里面有一个属性是 FillReference 表示样式里面的填充

<p:style>
<a:fillRef idx="2">
<a:schemeClr val="accent3"/>
</a:fillRef>
</p:style>

而这个样式要的属性是 idx 属性,表示属于主题的哪个样式

那么在 OpenXML SDK 里面如何获取主题,如果是在 Slide 页面的元素可以通过下面的代码获取主题

// Slide slide
var slidePart = slide.SlidePart;
FormatScheme formatScheme = slidePart?.ThemeOverridePart?.ThemeOverride?.FormatScheme;

当前,如果 Slide 拿不到就从 SlideLayoutPart 拿,再拿不到就从 SlideMasterPart 拿

然后是通过 FillReference 的 idx 从 FormatScheme 的 FillStyleList 拿到指定的元素,注意这里的 idx 使用的是从 1 开始的下标。但是 FillStyleList 的数组是 C# 的数组,下标是从 0 开始

// FillReference reference, FormatScheme formatScheme
if (reference.Index != null && formatScheme != null)
{
var index = (int) reference.Index.Value; var openXmlElementList = formatScheme.FillStyleList?.ChildElements; if (openXmlElementList != null)
{
return GetThemeElement(index, openXmlElementList);
}
}

而 GetThemeElement 方法的实现如下

        private static OpenXmlElement GetThemeElement(int index, OpenXmlElementList elements)
{
if (index > 0 && elements != null && elements.Count >= index)
{
//GetItem是0 base的数组,所以需要减去1
var xmlElement = elements.GetItem(index - 1); return xmlElement;
} return null;
}

此时就能拿到 OpenXmlElement 返回值了,这个 OpenXmlElement 是某个填充颜色。在 OpenXML SDK 里面没有给填充颜色一个基类,这部分的设计不是很好

在 PPT 文档里面对应的是 ppt\theme\themex.xml 文件里面的 a:fillStyleLst 的值

<a:fmtScheme name="Office">
<a:fillStyleLst>
<a:solidFill>
<a:schemeClr val="phClr"/>
</a:solidFill>
<a:gradFill rotWithShape="1">
<a:gsLst>
<a:gs pos="0">
<a:schemeClr val="phClr">
<a:tint val="50000"/>
<a:satMod val="300000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="35000">
<a:schemeClr val="phClr">
<a:tint val="37000"/>
<a:satMod val="300000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="100000">
<a:schemeClr val="phClr">
<a:tint val="15000"/>
<a:satMod val="350000"/>
</a:schemeClr>
</a:gs>
</a:gsLst>
<a:lin ang="16200000" scaled="1"/>
</a:gradFill>
<!-- 忽略代码 -->

上面文档里面用的是 idx 是 2 也就是对应 a:fillStyleLst 的第二项,也就是 a:gradFill 渐变的值

此时的主题的 a:gradFilla:gsLst 将会被形状的填充用到,如果形状的填充的颜色也是渐变色,如果这个渐变色没有设置 a:gsLst 的值,那么将会采用主题里面的 a:gsLst 的值。如果形状自己定义了就使用形状定义的

请看下图就知道如何获取

大部分的存在继承关系和联系的都在 OpenXML SDK 里面写出来关系了,只有这些比较边角的功能需要自己实现

而渐变色的各个属性的行为请看 Office Open XML - DrawingML - Shapes - Gradient Fill

官方文档请看 GradientFill Class (DocumentFormat.OpenXml.Drawing)

dotnet OpenXml SDK 形状填充渐变色的主题色的更多相关文章

  1. dotnet OpenXML 转换 PathFillModeValues 为颜色特效

    在 OpenXml 预设形状,有一些形状设置了 PathFillModeValues 枚举,此枚举提供了亮暗的蒙层特效.具体的特效是让形状选择一个画刷,在画刷上加上特效.如立体几何 Cube 形状,在 ...

  2. dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息

    在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式.本文来介绍如何读取 PPT 内嵌 ole 格式的 xls+ 表格的方法 在 ...

  3. OpenXml Sdk 根据Word模板导出到word

    一:OpenXml Sdk 简介 Open XML标准的简单介绍:Ecma Office Open XML(“Open XML”)是针对字处理文档.演示文稿和电子表格的国际化开放标准,可免费供多个应用 ...

  4. csharp:using OpenXml SDK 2.0 and ClosedXML read excel file

    https://openxmlexporttoexcel.codeplex.com/ http://referencesource.microsoft.com/ 引用: using System; u ...

  5. [Office][C#] NPOI、OpenXML SDK、OpenOffice.org SDK 写入资料到 EXCEL 档案[转]

    原文地址:http://www.dotblogs.com.tw/chou/archive/2010/04/29/14912.aspx 一.簡介 要將資料寫入 EXCEL 檔案有許多的方法,但假如電腦不 ...

  6. 其于OpenXml SDK写的帮助类

    /// <summary> /// 其于OpenXml SDK写的帮助类 /// </summary> public static class OpenXmlHelper { ...

  7. Open-Xml SDK使用介绍

    Office Open XML 简称为 ooxml ,是Microsoft 在 Office 2007 之后推行的标准格式,用在 Excel, Word, PPT 等文件.已确定为国际标准. Open ...

  8. 腾讯云 docker 镜像 dotnet/core sdk aspnet

    ccr.ccs.tencentyun.com/mcr.microsoft.com/dotnetcoresdk  = mcr.microsoft.com/dotnet/core/sdk  => 3 ...

  9. OpenXml SDK学习笔记(1):Word的基本结构

    能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...

  10. Swift主题色顶级解决方案

    一.常规主题色使用点 应用在发布前都会对主题色进行设置,以统一应用的风格(可能有多套主题).在主题色设置上有几个方面,如下: 1. TabBar部分,设置图片高亮.文本高度颜色2. Navigatio ...

随机推荐

  1. 记录--没有await,如何处理“回调地狱”

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 太长不看 不要嵌套使用函数.给每个函数命名并把他们放在你代码的顶层 利用函数提升.先使用后声明. 处理每一个异常 编写可以复用的函数,并把 ...

  2. 提升团队协作效率:欧奥PicHome打造无缝资料共享平台

    1. 引言 在快节奏的工作环境中,团队成员需要快速访问和共享信息.有效的资料共享不仅提高工作效率,还能促进团队协作和创新.然而,许多团队仍在使用传统的文件共享方法,这些方法往往效率低下,难以满足现代工 ...

  3. 嵌入式C语言设计学习之C语言回顾

    C的基本语法-回忆 1.C的结构 C语言的结构还是以函数为主体,通过其他资源的添加来实现高级语言逻辑.所有的操作都是基于主函数展开的.以主函数为顺序列表,其他函数作为功能模块,组成一个完整的系统.所以 ...

  4. Java程序连接KingbaseES 异常

    错误信息: --KStudio客户端工具错误信息 The conncetion attempt failed.Reason:connect time out --Java应用程序控制台日志 Cause ...

  5. 11.硬核的volatile考点分析

    大家好,我是王有志.关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活. 今天我们学习并发编程中另一个重要的关键字volatile,虽然面试中它的占比低于synchronized,但依旧是不可忽略的内容 ...

  6. Python 注释:解释和优化代码可读性

    注释可以用来解释Python代码.注释可以用来使代码更易读.注释可以用来在测试代码时防止执行. 创建注释 注释以#开始,Python会忽略它们: 示例:获取您自己的Python注释 # 这是一个注释 ...

  7. sql注入--基础注入判断方法(构造闭合)

    在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...

  8. openGauss内存引擎中的索引

    一.索引 索引是一种用于快速查询和检索数据的数据结构.常见的索引结构有: B 树, B+树和 Hash. 索引的作用就相当于目录的作用.打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一 ...

  9. MogDB学习笔记之 -- 了解pagewriter线程

    MogDB 学习笔记之 -- 了解 pagewriter 线程 本文出处:https://www.modb.pro/db/183172 在前面的 MogDB 学习系列中,我们了解了核心的 bgwrit ...

  10. 算法小白刷了一周 LeetCode 后的思考

    Hi,我是 itchao 我自己工作有 2 两年多的前端开发经验,但是数据结构与算法一直不好,基本就是一个算法小白的水平. 听说大公司面试都要手写算法题,最近为了以后能去更好的公司,然后其实心里比较着 ...