dotnet OpenXML 读取形状轮廓线条样式序号超过主题样式列表数
1.dotnet OpenXml SDK 形状填充渐变色的主题色
2.dotnet OpenXML 读取形状轮廓线条样式序号超过主题样式列表数
3.dotnet OpenXML 读取 PPT 形状边框定义在 Style 的颜色画刷4.dotnet OpenXML 文本删除线解析方法5.dotnet OpenXML 继承组合颜色的 GrpFill 属性6.dotnet OpenXML 读取 PPT 主序列进入退出强调动画7.dotnet OpenXML 解析 PPT 图表 面积图入门8.使用 WPF 做个 PowerPoint 系列 文本 BodyProperties 的 FontScale 与文本字号缩放9.使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果10.dotnet OpenXML 聊聊文本段落对齐方式11.dotnet OpenXML 读取 PPT 内嵌 xlsx 格式 Excel 表格的信息12.dotnet OpenXML 转换 PathFillModeValues 为颜色特效13.dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息14.dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息15.dotnet OpenXML 解析 PPT 图表 解析日期时间表示内容16.使用 MAUI 在 Windows 和 Linux 上绘制 PPT 的图表在 OpenXML 中,默认的形状可以通过指定 LineReference 让形状使用文档主题里面的样式。文档主题里面包含多个样式,在形状里面指定样式通过的是序号的方法,如果在形状里面指定的序号超过了主题的数量,那么将会使用最后一项样式
开始之前,我准备了这份课件,我将课件和代码都放在 GitHub 上可以在本文最后找到链接
在这份课件中,第一页里面有一个形状元素,在形状元素里面定义了样式使用的是第 5 个样式
<p:sp>
<p:style>
<a:lnRef idx="5">
<a:schemeClr val="accent1">
<a:shade val="50000" />
</a:schemeClr>
</a:lnRef>
</p:style>
</p:sp>
使用 C# dotnet 使用 OpenXml 解析 PPT 文件 博客的方法打开这份课件,可以使用如下代码读取到使用的 LineReference 样式
using (var presentationDocument =
DocumentFormat.OpenXml.Packaging.PresentationDocument.Open("测试.pptx", false))
{
var presentationPart = presentationDocument.PresentationPart;
var slidePart = presentationPart.SlideParts.First();
var shape = slidePart.Slide.Descendants<Shape>().First();
var lineReference = shape.Descendants<LineReference>().First();
/*
<p:sp>
<p:style>
<a:lnRef idx="5">
<a:schemeClr val="accent1">
<a:shade val="50000" />
</a:schemeClr>
</a:lnRef>
</p:style>
</p:sp>
*/
var lineStyle = lineReference.Index.Value;
// 这里的值是 5 表示使用主题的第 5 个样式
// 文档规定,Index是从1开始的
// https://docs.microsoft.com/en-za/dotnet/api/documentformat.openxml.drawing.linereference?view=openxml-2.8.1
lineStyle--;
}
以上的细节是 a:lnRef
指定的 idx 是序号,而序号是从 1 开始的,咱的集合默认使用 0 开始
接下来是获取文档的主题,在 Office 的优先级是 Slide 然后是 SlideLayout 最后才是 SlideMaster 的主题
// 获取主题
var themeOverride = slidePart.ThemeOverridePart?.ThemeOverride
?? slidePart.SlideLayoutPart.ThemeOverridePart?.ThemeOverride;
FormatScheme formatScheme = themeOverride?.FormatScheme;
if (formatScheme is null)
{
formatScheme = slidePart.SlideLayoutPart.SlideMasterPart.ThemePart.Theme.ThemeElements.FormatScheme;
}
在这份课件,使用的是放在 Theme1.xml 里面的主题
<a:themeElements>
<a:fmtScheme name="Office">
<a:lnStyleLst>
<a:ln w="6350" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:schemeClr val="phClr" />
</a:solidFill>
<a:prstDash val="solid" />
<a:miter lim="800000" />
</a:ln>
<a:ln w="12700" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:schemeClr val="phClr" />
</a:solidFill>
<a:prstDash val="solid" />
<a:miter lim="800000" />
</a:ln>
<a:ln w="69050" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:srgbClr val="954F72" />
</a:solidFill>
<a:prstDash val="solid" />
<a:miter lim="800000" />
</a:ln>
</a:lnStyleLst>
</a:fmtScheme>
</a:themeElements>
以上的 FormatScheme 类就是存放 a:fmtScheme
的内容
使用下面代码获取线条样式
var lineStyleList = formatScheme.LineStyleList;
var outlineList = lineStyleList.Elements<Outline>().ToList();
如果形状的样式序号没有大于主题定义的样式列表数量,那么使用对应的样式。如果定义的序号超过了主题定义的样式列表数量,就需要使用最后一个样式,请看代码
Outline themeOutline;
if (lineStyle > outlineList.Count)
{
themeOutline = outlineList[^1];
}
else
{
themeOutline = outlineList[(int)lineStyle];
}
上面代码获取的 Outline 就是形状线条在主题样式的值
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。
合集:
OpenXML
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
2018-05-26 C# ValueTuple 原理
2018-05-26 C# ValueTuple 原理