在 PPT 里面的表格可以通过表格样式配置决定表格的样式,本文将和大家介绍如何获取和解析表格的样式

本文属于 OpenXML 系列博客,有一定的上下文,详细请参阅 Office 使用 OpenXML SDK 解析文档博客目录

在 PPT 里面的表格,如存放在页面 Slide 里面的表格,可以通过 a:tableStyleId 属性存放表格的样式 Id 值。表格的样式可以采用自定义表格样式,也可以采用应用自带的样式。为了兼容性,大部分情况下,即使采用应用自带的样式,也是会将样式模版放入到 TableStylesPart 里面去,也就是对应的 TableStyles.xml 文件里面

放在 Slide 里面的表格的代码大概如下

      <p:graphicFrame>
<p:nvGraphicFramePr>
<p:cNvPr id="4" name="表格 4">
...
</p:cNvPr>
<p:nvPr>
...
</p:nvPr>
</p:nvGraphicFramePr>
<p:xfrm>
<a:off x="2032000" y="719666" />
<a:ext cx="8127999" cy="1112520" />
</p:xfrm>
<a:graphic>
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/table">
<a:tbl>
<a:tblPr firstRow="1" bandRow="1">
<a:tableStyleId>{21E4AEA4-8DFA-4A89-87EB-49C32662AFE0}</a:tableStyleId>
</a:tblPr>
<a:tblGrid>
...
</a:tblGrid>
...
</a:tbl>
</a:graphicData>
</a:graphic>
</p:graphicFrame>

以上的 <a:tableStyleId>{21E4AEA4-8DFA-4A89-87EB-49C32662AFE0}</a:tableStyleId> 就是用来定制表格采用哪个样式

对应的样式的细节定义,大部分时候可以从 TableStylesPart 里面,也就是对应的 TableStyles.xml 文件里面去找到,里面存放的样式代码大概如下

  <a:tblStyleLst xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" def="{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}">
<a:tblStyle styleId="{21E4AEA4-8DFA-4A89-87EB-49C32662AFE0}">
<a:wholeTbl>
...
</a:wholeTbl>
</a:tblStyle>
</a:tblStyleLst>

另一些样式是直接存放到 TableProperties 也就是对应的 a:tblPr 的 TableStyle 里面去,对于这样定义的文档来说,直接获取 TableStyle 即可

大概的获取代码如下

// 先已拿到 Table 对象,也就是 a:tbl 属性
// 以下代码存放在获取表格样式方法 var tableProperties = table.TableProperties; if (tableProperties is null)
{
return null;
} // 有一些PPT的样式是放在tblPr属性里的。
var tableStyle = tableProperties.GetFirstChild<TableStyle>();
if (tableStyle != null)
{
return tableStyle;
} // 2016新版本PPT是通过TableStyleId去寻找样式表的。
var tableStyleId = tableProperties.GetFirstChild<TableStyleId>();
if (tableStyleId is null)
{
return null;
} var text = tableStyleId.Text;
// 以下的 document 是 PresentationDocument 类型
var tableStyleList = document.PresentationPart.TableStylesPart
?.TableStyleList;
var tableStyleEntry = tableStyleList?.Elements<TableStyleEntry>()
.FirstOrDefault(temp => temp.StyleId == text);

对于一些文档来说,如果采用的是应用自带的样式,可能没有将样式内容存放到 TableStylesPart 里面去。此时就采用应用级样式,所谓应用级样式属性,那就是编写在代码里面的样式。比如本文所使用 {21E4AEA4-8DFA-4A89-87EB-49C32662AFE0} 样式。此样式是可以在 PPTX 文档里面默认不写样式定义的

对应以上的代码,也就是无法从 TableStyleList 里面获取到 tableStyleEntry 对象。此时就需要采用代码自己编写预设的样式

            // 从 Application 级获取表格的样式。
tableStyleEntry ??= TableStyleEntryProvider.CreateTableStyleEntry(text); return tableStyleEntry;

这里的 TableStyleEntryProvider 类型是我编写的代码,里面包含了大量的预设表格样式。此代码放入到 dotnetCampus.DocumentFormat.OpenXml.Flatten 库里面,代码在 GitHub 完全开源,详细请参阅 https://github.com/dotnet-campus/DocumentFormat.OpenXml.Extensions

更多请看 Office 使用 OpenXML SDK 解析文档博客目录

dotnet OpenXML 解析 PPT 里表格的样式的更多相关文章

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

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

  2. 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果

    本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...

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

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

  4. [转]CSS如何设置html table表格边框样式

    原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...

  5. JavaScript(第二十天)【DOM操作表格及样式】

    DOM在操作生成HTML上,还是比较简明的.不过,由于浏览器总是存在兼容和陷阱,导致最终的操作就不是那么简单方便了.本章主要了解一下DOM操作表格和样式的一些知识. 一.操作表格 <table& ...

  6. WPF解析PPT为图片

    偶遇需要解析 PPT为单张图片 其中,对于包含动画的PPT页,分别对动画最后效果进行截取,即每个连续动画截取 (动画N个)N+1(原图)张 http://git.oschina.net/jiailiu ...

  7. Android在一个TextView里显示不同样式的字体

    在同一个TextView里显示不同样式的字体 public void setSpan(Object what, int start, int end, int flags); 样式1:背景色.粗体.字 ...

  8. 表格-table 样式

    .table: 表格基本样式 .table-dark:表格显示为黑色 .thead-light: 表头显示颜色跟亮 .thead-dark:表头显示为黑色 .table-striped:表格以条纹形式 ...

  9. ch7对表单和数据表格使用样式

    对数据表格应用样式 1.表格特有的元素 caption:基本上用做表格的标题.summary:可应用于表格的标签,用来描述表格的内容(与image的alt文本相似) <table class=& ...

  10. java 解析URL里的主域名及参数工具类

    java 解析URL里的协议及参数工具类,解析URL中的主域名,并统一把协议修改成http或去掉协议 public class UrlDomainUtils { private static fina ...

随机推荐

  1. 更智能的广告素材生成!看A/B测试如何驱动AIGC素材调优

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 前言:AIGC大爆发,引发广告营销行业变革 ChatGPT等AI产品引发的AIGC大爆发引起了各行业的震动,其中以 ...

  2. Dll堆栈问题(Dll的静态变量与全局变量、vs的MT与MD)

    问题引入:dll有一个导出函数,函数参数是string&,string在函数内部被=赋值.在exe动态加载此dll,调用此导出函数后,会崩溃. 原因:如果任何STL类的实现中使用了静态变量(我 ...

  3. hackme 【攻防世界】Reverse

    题目: 丢到PE里, 无壳,64bit 丢到IDA里,shift+F12,查看字符串,找到一个很可疑的字符串 跟进去看看,找到目标函数,我另外搜索了一下,没有mian函数,sub_400F8E应该就是 ...

  4. KingbaseESV8R6手工vacuum带有全局分区索引的分区表的影响

    背景 客户现场有这样一个案例,有张500个分区的大表,每个分区有20万条记录.有update 非常频繁,经常会触发autovacuum.由于表很大,autovacuum 耗时很长.据现场同事反馈,手工 ...

  5. IDEA MyBatis Log 插件,打印SQL语句

    打开Settings->plugins 搜索插件 MyBatis Log点击安装,完成后重启IDEA即可. 点击Tools,选择 MyBatis Log Plugin ,会在下方打开一个窗口,这 ...

  6. 5 JavaScript变量提升

    5 变量提升 看以下代码, 或多或少会有些问题的. function fn(){ console.log(name); var name = '大马猴'; } fn() 发现问题了么. 这么写代码, ...

  7. 1.NCC算法实现及其优化[基础实现篇]

    NCC算法实现及其优化 本文将集中探讨一种实现相对简单,效果较好的模板匹配算法(NCC) \[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x', ...

  8. Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间

    Java 用户输入(Scanner) 简介 Scanner 类用于获取用户输入,它位于 java.util 包中. 使用 Scanner 类 要使用 Scanner 类,请执行以下步骤: 导入 jav ...

  9. Python smtp发送邮件怎么设置抄送人

    设置抄送人,非常简单,只需要添加一条信息就可以了,例: cc_list = ['xx@xxx.cn', 'xx@xxx.cn'] msg['Cc'] = ','.join(cc_list) smtp. ...

  10. HarmonyOS Connect FAQ第四期

    原文:https://mp.weixin.qq.com/s/bvaV086QTnpnDFyYAVxQwQ,点击链接查看更多技术内容.在HarmonyOS Connect生态产品的认证测试环节,你是否存 ...