dotnet OpenXML 解析 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 解析文档博客目录

posted @ 2023-09-05 15:34  lindexi  阅读(97)  评论(0编辑  收藏  举报