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

如何使用C# OpenXML获取Word中OleObject的链接路径

获取Office文档中链接文件的路径

需求说明

仅需提取Excel、Word、PowerPoint文档中链接对象指向的外部文件路径,无需提取文件本身。Excel可通过OpenXML的ExternalRelationships直接获取,但Word和PowerPoint的链接存储逻辑不同,需针对性处理。

Excel 实现代码

通过ExternalWorkbookPart的ExternalRelationships集合获取链接路径:

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbook = document.WorkbookPart;
    foreach (ExternalWorkbookPart externalWorkbook in workbook.ExternalWorkbookParts)
    {
        foreach (ExternalRelationship link in externalWorkbook.ExternalRelationships)
        {
            // link.Uri.ToString() 即为链接文件的路径
            Console.WriteLine("Excel链接路径: " + link.Uri.ToString());
        }
    }
}

Word 文档(.docx)处理方案

Word的链接型OLE对象存储在EmbeddedPackagePart中,需解析其中的Ole10Native二进制结构获取路径:

实现代码

using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, false))
{
    foreach (var oleObject in doc.MainDocumentPart.Document.Body.Descendants<OleObject>())
    {
        // 判断是否为链接型OLE对象
        if (oleObject.OleItemType == OleItemType.Link)
        {
            var part = doc.MainDocumentPart.GetPartById(oleObject.Id);
            if (part is EmbeddedPackagePart packagePart)
            {
                using (var stream = packagePart.GetStream())
                {
                    var ole10Native = new Ole10Native(stream);
                    Console.WriteLine("Word链接路径: " + ole10Native.Path);
                }
            }
        }
    }
}

PowerPoint 文档(.pptx)处理方案

PowerPoint的链接存储逻辑与Word类似,遍历幻灯片中的OLE对象,解析EmbeddedPackagePart中的Ole10Native数据:

实现代码

using (PresentationDocument presentation = PresentationDocument.Open(filePath, false))
{
    foreach (var slidePart in presentation.PresentationPart.SlideParts)
    {
        foreach (var oleObject in slidePart.Slide.Descendants<OleObject>())
        {
            // 判断是否为链接型OLE对象
            if (oleObject.IsLink)
            {
                var part = slidePart.GetPartById(oleObject.Id);
                if (part is EmbeddedPackagePart packagePart)
                {
                    using (var stream = packagePart.GetStream())
                    {
                        var ole10Native = new Ole10Native(stream);
                        Console.WriteLine("PowerPoint链接路径: " + ole10Native.Path);
                    }
                }
            }
        }
    }
}

Ole10Native 解析工具类

手动实现Ole10Native二进制结构的解析,无需依赖第三方库:

using System.IO;
using System.Text;

public class Ole10Native
{
    public string Path { get; private set; }

    public Ole10Native(Stream stream)
    {
        using (var reader = new BinaryReader(stream))
        {
            // 验证Ole10Native起始标志
            if (reader.ReadUInt16() != 0x0001)
                throw new InvalidDataException("无效的Ole10Native数据格式");

            // 跳过保留字段
            reader.ReadUInt32(); // Flags
            reader.ReadUInt32(); // DataSize
            int pathOffset = reader.ReadInt32();
            int pathLength = reader.ReadInt32();

            // 定位到路径数据起始位置
            stream.Seek(pathOffset, SeekOrigin.Begin);
            // 读取Unicode编码的路径
            byte[] pathBytes = reader.ReadBytes(pathLength * 2);
            Path = Encoding.Unicode.GetString(pathBytes).TrimEnd('\0');
        }
    }
}

说明

  • 上述方案无需解压.bin文件,直接通过流解析Ole10Native结构,比解压后处理更高效。
  • 需引用DocumentFormat.OpenXml NuGet包,版本建议与.NET环境匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:45:31