You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenXML SDK获取PowerPoint形状的Tag(p:tag)值?

如何使用OpenXml读取PowerPoint形状的自定义标签值

核心访问路径

按照你梳理的OOXML结构,正确的标签读取路径为:
Shape → NonVisualShapeProperties → ApplicationNonVisualDrawingProperties (对应p:nvPr) → CustomerDataList (对应p:custDataLst) → 带p:tags类型的CustomerData元素 → 通过rId关联UserDefinedTagsPart → 读取TagList中的目标标签

完整实现代码

将你已有的形状遍历代码修改如下,在循环内添加标签读取逻辑:

using DocumentFormat.OpenXml.Presentation;
using System.Linq;

// 你的现有遍历逻辑
for (int x = 0; x < doc.PresentationPart.SlideParts.Count(); x++)
{
    SlidePart slide = doc.PresentationPart.SlideParts.ElementAt(x);
    IEnumerable<Shape> slShapes = slide.Slide.Descendants<Shape>();
    foreach (Shape shape in slShapes)
    {
        // 获取形状的非视觉属性容器
        var nonVisualProps = shape.NonVisualShapeProperties;
        if (nonVisualProps == null) continue;

        // 获取应用程序自定义非视觉属性(对应p:nvPr)
        var nvPr = nonVisualProps.ApplicationNonVisualDrawingProperties;
        if (nvPr == null) continue;

        // 获取自定义数据列表(对应p:custDataLst)
        var custDataList = nvPr.CustomerDataList;
        if (custDataList == null) continue;

        // 遍历所有自定义数据项,定位标签关联项
        foreach (var custData in custDataList.CustomerData)
        {
            if (custData.Tags != null && !string.IsNullOrEmpty(custData.Tags.Id))
            {
                string rId = custData.Tags.Id;
                // 通过rId获取对应的标签部件
                if (slide.TryGetPartById(rId, out UserDefinedTagsPart tagsPart))
                {
                    // 查找名称为"MOUNTAIN"的标签
                    var targetTag = tagsPart.TagList?.Tags.FirstOrDefault(t => t.Name == "MOUNTAIN");
                    if (targetTag != null)
                    {
                        string mountainValue = targetTag.Val;
                        // 此处可根据需求处理标签值,例如输出或存储
                        // Console.WriteLine($"形状标签MOUNTAIN的值:{mountainValue}");
                    }
                }
            }
        }
    }
}

关键代码说明

  • NonVisualShapeProperties:对应OOXML中的p:nvSpPr,是形状非视觉属性的顶层容器
  • ApplicationNonVisualDrawingProperties:对应p:nvPr,存储PowerPoint应用自定义的非视觉数据
  • custData.Tags.Id:获取标签部件的关联ID(rId),用于定位到具体的标签文件
  • TryGetPartById:通过rId直接从幻灯片部件中获取UserDefinedTagsPart,比手动遍历更高效
  • TagList.Tags:标签部件中的标签集合,通过FirstOrDefault快速筛选目标名称的标签

注意事项

  • 确保项目已引用DocumentFormat.OpenXml NuGet包,并导入对应命名空间
  • 所有步骤添加空值检查,避免因形状无标签或属性缺失导致的空引用异常

内容的提问来源于stack exchange,提问作者Andrew Hall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:45:37