学习C#调用OpenXml操作word文档的基本用法(21:学习嵌入对象类)

OpenXml中使用EmbeddedObjectPart类处理Word文档内嵌入的OLE对象,MainDocumentPart类的EmbeddedObjectParts属性保存所有的OLE对象。以下图为例,向上一篇文章中的word文档中粘贴mp3文件和xml文件,采用解压缩软件打开Word文档,其内的embeddings文件夹中圈红处保存后续插入的两个文件的OLE对象数据,而media文件夹内圈红处则保存每个OLE对象在word文档中的显示图标。


  MainDocumentPart类的EmbeddedObjectParts属性保存OLE对象集合,其类型为IEnumerable <EmbeddedObjectPart>,EmbeddedObjectPart类存储OLE对象数据,命名空间为DocumentFormat. OpenXml. Packaging。
  EmbeddedObjectPart类的RelationshipType属性为固定字符串,值为"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject",ContentType属性保存内容类型,通过Uri属性可以获取ole对象文件的路径及文件名,不过对于OLE对象而言,ContentType的值大部分都是相同的,不像EmbeddedPackagePart类的ContentType值区别较大。下面的代码及截图用于获取word文档的ole对象列表(追加到前一篇文章的嵌入文件列表内)。

csharp 复制代码
if (mainPart.EmbeddedObjectParts != null)
{
    foreach (EmbeddedObjectPart objectPart in mainPart.EmbeddedObjectParts)
    {
        ListViewItem item = new ListViewItem(Convert.ToString(lstPackages.Items.Count + 1));
        item.SubItems.Add(mainPart.GetIdOfPart(objectPart));
        item.SubItems.Add(objectPart.ContentType);
        item.SubItems.Add(objectPart.Uri.IsAbsoluteUri ? objectPart.Uri.AbsoluteUri : objectPart.Uri.OriginalString);

        lstPackages.Items.Add(item);        
    }
}


  通过调用EmbeddedObjectPart类的GetStream函数可以获取文件流,可以将其保存到本地或另做他用,不过文件都是以bin为后缀的ole文件,需要进一步解析文件内容以确定具体的文件类型。示例代码如下所示:

csharp 复制代码
EmbeddedObjectPart oPart=FindOlePart( mainPart.EmbeddedObjectParts);
string ext = System.IO.Path.GetExtension(oPart.Uri.OriginalString);
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = $"{ext} files|*.{ext}";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
    using (Stream embeddedStream = oPart.GetStream())
    {
        // 将流写入新文件
        using (FileStream fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create))
        {
            embeddedStream.CopyTo(fileStream);
        }
    }
}

EmbeddedPackagePart类和EmbeddedObjectPart类的功能和定位都类似,前者专用于嵌入另一个OpenXML格式的文档,是一个完整的、压缩的OpenXML包,内部结构与主文档相同,而后者则是一个通用容器,嵌入的可以是早期二进制格式(如 .xls)、图表、媒体文件等,数据组织方式各异。通过大模型给出这两者的区别以供参考:

参考文献

1\]https://github.com/dotnet/Open-XML-SDK \[2\]https://learn.microsoft.com/zh-cn/office/open-xml/open-xml-sdk \[3\]https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.style?view=openxml-3.0.1 \[4\]https://blog.csdn.net/i042416/article/details/126228816

相关推荐
老骥伏枥~2 小时前
C# if / else 的正确写法与反例
开发语言·c#
老骥伏枥~2 小时前
C# 运算符优先级易踩坑
c#
SunnyDays10113 小时前
C# 实战:从 Word 文档中提取指定页面
c#·提取word文档页面·将word页面复制到另一个文档
骆驼爱记录3 小时前
Word通配符技巧:高效文档处理指南
开发语言·c#·自动化·word·excel·wps·新人首发
人工智能AI技术3 小时前
智能体元年第一课:使用Microsoft Foundry + AI Toolkit 10分钟构建你的第一个多模态Agent
人工智能·c#
柱子jason3 小时前
基于IOT-Tree Server支持的gRPC服务,使用C#开发自己的设备监控客户端
物联网·rpc·c#·自动化·iiot·iot-tree
骆驼爱记录4 小时前
Word表格题注自动设置全攻略
开发语言·c#·自动化·word·excel·wps·新人首发
Evonso4 小时前
视频转码与切片(HLS)完整教程
c#
lfq7612044 小时前
.NET Framework 下 C# MVC 项目敏感信息安全存储方法
安全·c#·mvc·.net