代码编织梦想

本文收集元素属性 cNvPr Non-Visual Drawing Properties 的属性的作用

本文的 Non-Visual Drawing Properties 也就是在 OpenXML 文档里面的 cNvPr 代码,在 ECMA 376 的 20.2.2.3 文档有详细说明

在形状的 Non-Visual Drawing Properties 使用 p:cNvPr 表示,在图片使用 pic:cNvPr 表示等

本文的 OpneXMl SDK 的获取代码前提都有以下代码

public void Foo(NonVisualDrawingProperties nonVisualDrawingProperties)
{
    
}

id

这是一个必须包含的属性

虽然全名是 Unique Identifier 表示层级里面唯一的 id 标识,但是实际可以存在重复。根据 ECMA 376 的说法是在当前文档里面唯一的 id 标识。但实际上范围只是当前层级。例如在 Slide 页面里面的多个元素,可以通过这个 id 作为区分,而在一个组合元素里面,允许组合里面的元素的 id 和 Slide 页面的其他元素 id 是重复的

而且这个 id 标识是允许重复的,在实际的 Office 里面将会使用比较复杂的规则来解决 id 是重复。如果一份文档里面存在重复的 id 标识,可以认为这份文档是不规范的

这个 id 可以让元素被其他部分所引用,最简单的如动画,如下面代码,一份文档有两个矩形,而动画依靠这个 id 判断使用哪个矩形

  <p:cSld>
    <p:spTree>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="2" name="矩形 3" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
      <p:sp>
        <p:nvSpPr>
          <p:cNvPr id="3" name="矩形 3" />
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>
        <!-- 忽略代码 -->
      </p:sp>
    </p:spTree>
  </p:cSld>
  <p:timing>
    <p:tnLst>
      <p:par>
        <!-- 忽略代码 -->
                                        <p:tgtEl>
                                          <p:spTgt spid="3" />
                                        </p:tgtEl>
        <!-- 忽略代码 -->
      </p:par>
    </p:tnLst>
  </p:timing>

上面代码的动画使用 p:spTgt spid="3"spid="3" 引用 id 是 3 的元素,使用 PPT 打开如下,可以看到第二个元素设置动画

在 OpenXML SDK 的读取方法如下

    var id = nonVisualDrawingProperties.Id;

测试课件请点击 元素id形状.pptx 下载

虽然在标准里面这个标识是不会重复的,但实际的课件会有重复的 id 和不存在的 id 此时就需要使用 dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 重复 id 标识处理 的方法

name

用于表示元素的名字,这个名字使用本地语言,可以用来在应用程序给用户了解当前元素的名字。这是一个必须包含的属性

        <p:nvSpPr>
          <p:cNvPr id="2" name="林德熙是逗比"/>
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>

如上面代码,可以设置元素名,这个元素名可以在 PPT 的选择窗格看到。更改元素名也可以在 PPT 的选择窗格更改

另一个在 PPT 可见的是在动画的窗格

在 OpenXML SDK 的读取方法如下

    var name = nonVisualDrawingProperties.Name;

测试课件请点击 元素名.pptx 下载

title

表示当前元素的标题,标题和下面的 descr 描述的作用是在元素不能显示的时候,可以用来替换的文本。也用来给辅助模块使用,如屏幕阅读器

官方的说法是 标题和说明提供表格、图示和其他对象中包含的信息的可选、基于文本的表示法

在 OpenXML SDK 的读取方法如下

    var title = nonVisualDrawingProperties.Title;

descr

全名是 Alternative Text for Object 用于指定当前元素的代替文本,用于提供给辅助的模块,包括屏幕阅读器使用。也可以用在不支持当前元素的时候显示的文本

在 OpenXML SDK 的读取方法如下

    var description = nonVisualDrawingProperties.Description;

在 PPT 可以在形状设置看到内容,如下面代码

        <p:nvSpPr>
          <p:cNvPr id="2" name="林德熙是逗比" title="标题" descr="描述"/>
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>

测试课件请点击 元素标题.pptx 下载

hidden

可以设置元素是否可见

        <p:nvSpPr>
          <p:cNvPr id="2" name="林德熙是逗比" hidden="true"/>
          <p:cNvSpPr />
          <p:nvPr />
        </p:nvSpPr>

这个功能可以对应在 PPT 的选择窗格里面的元素是否可见,如上面这份文档,可以在选择窗格里面看到元素是不可见的

如果去掉上面这个 hidden="true" 属性,那么可以看到选择窗格里面的可见图标修改

打开选择窗格的方法是在 PPT 的选择下拉,点击选择窗格

在 OpenXML SDK 的读取方法如下

    var hidden = nonVisualDrawingProperties.Hidden;

测试课件请点击 元素不可见.pptx 下载

本文的属性是依靠 dotnet OpenXML 解压缩文档为文件夹工具 工具协助测试的,这个工具是开源免费的工具,欢迎小伙伴使用

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

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/lindexi_gd/article/details/110531822

dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低-爱代码爱编程

我在 Office 的 Open-XML-SDK 库里面找到有代码线程不安全,代码里面使用了 TryGetValue 加 TryAdd 的方法添加对象,而线程安全的方法是通过 GetOrAdd 方法。不过在小伙伴的评论我找到了 GetOrAdd 性能其实在有闭包的时候不如使用 TryGetValue 加 TryAdd 调用这两个方法,但是 GetOrAdd

WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式-爱代码爱编程

在 WPF 中,如果有一个样式是继承另一个样式,而样式没有使用 TargetType 那么在运行的时候会提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式 在界面添加下面代码 <Window.Resources> <Style x:Key="Style1

WPF 调试因为对象不同而绑定失效问题-爱代码爱编程

在 WPF 使用绑定的时候,发现绑定不上,也许是因为绑定的对象不是当前作用的对象的原因。也许是绑定错了对象,或者对象被变更了。本文来告诉大家这个调试思路和方法 使用一个简单的例子来告诉大家,这样比较直观 我有一个简单的应用,这个应用的字符串显示绑定了一个 ToggleButton 也就是下图的写着 点击 的按钮 在 ToggleButton 的

开源实战-爱代码爱编程

本文记录我参与的开源项目 dotnet runtime Add logger to cache entry to catch exception by lindexi · Pull Request #37292 · dotnet/runtimeUse Array.Empty in CompositeFileProvider by lindexi · P

制作的 dotnet tool 运行失败提示依赖缺失-爱代码爱编程

小伙伴做了一个很好用的 dotnet tool 工具,但是这个工具仅在他的设备上能运行,在我的设备上运行就会退出提示 An assembly specified in the application dependencies manifest (LindexiDoubi.deps.json) was not found 找不到依赖 默认选择 dotnet

非技术 在线教育与电信行业的发展-爱代码爱编程

今天在去买菜的时候,听到旁边有个移动的小哥哥在向一位大叔叔推荐办理移动带宽升级业务,他说到一句话,你升级一下带宽,你的小孩上在线课程的时候多顺哇。本来是没当回事,只是无聊的时候想到这一点,我认为这里是一个大的利益链,于是写博客记一下 现在是 2020.08.30 我想看看是否我认为的是对的 本文不聊任何技术,也不聊任何音视频相关的技术哈,只是想聊聊利益

dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低-爱代码爱编程

我在 Office 的 Open-XML-SDK 库里面找到有代码线程不安全,代码里面使用了 TryGetValue 加 TryAdd 的方法添加对象,而线程安全的方法是通过 GetOrAdd 方法。不过在小伙伴的评论我找到了 GetOrAdd 性能其实在有闭包的时候不如使用 TryGetValue 加 TryAdd 调用这两个方法,但是 GetOrAdd

WPF 绑定继承的样式提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式-爱代码爱编程

在 WPF 中,如果有一个样式是继承另一个样式,而样式没有使用 TargetType 那么在运行的时候会提示 只能根据带有基类型 IFrameworkInputElement 的目标类型的 Style 样式 在界面添加下面代码 <Window.Resources> <Style x:Key="Style1

WPF 调试因为对象不同而绑定失效问题-爱代码爱编程

在 WPF 使用绑定的时候,发现绑定不上,也许是因为绑定的对象不是当前作用的对象的原因。也许是绑定错了对象,或者对象被变更了。本文来告诉大家这个调试思路和方法 使用一个简单的例子来告诉大家,这样比较直观 我有一个简单的应用,这个应用的字符串显示绑定了一个 ToggleButton 也就是下图的写着 点击 的按钮 在 ToggleButton 的

开源实战-爱代码爱编程

本文记录我参与的开源项目 dotnet runtime Add logger to cache entry to catch exception by lindexi · Pull Request #37292 · dotnet/runtimeUse Array.Empty in CompositeFileProvider by lindexi · P

制作的 dotnet tool 运行失败提示依赖缺失-爱代码爱编程

小伙伴做了一个很好用的 dotnet tool 工具,但是这个工具仅在他的设备上能运行,在我的设备上运行就会退出提示 An assembly specified in the application dependencies manifest (LindexiDoubi.deps.json) was not found 找不到依赖 默认选择 dotnet

非技术 在线教育与电信行业的发展-爱代码爱编程

今天在去买菜的时候,听到旁边有个移动的小哥哥在向一位大叔叔推荐办理移动带宽升级业务,他说到一句话,你升级一下带宽,你的小孩上在线课程的时候多顺哇。本来是没当回事,只是无聊的时候想到这一点,我认为这里是一个大的利益链,于是写博客记一下 现在是 2020.08.30 我想看看是否我认为的是对的 本文不聊任何技术,也不聊任何音视频相关的技术哈,只是想聊聊利益