学习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

相关推荐
bugcome_com20 小时前
C# 泛型(Generic)完全指南:从基础到高级应用
c#
我是唐青枫20 小时前
C#.NET Memory 深入解析:跨异步边界的内存视图与高性能实战
开发语言·c#·.net
人工智能AI技术21 小时前
AI Gateway 实战:基于 C# 与 YARP 构建多模型统一接入与路由网关
人工智能·c#
热爱生活的五柒1 天前
为什么word里面没有墨迹公式,从哪找
word
njsgcs1 天前
solidworks 导出dwg 带映射模板 c# 图纸比例一比一导出
c#·solidworks
人工智能AI技术1 天前
美团“问小团”同款架构:C# + ASP.NET Core 搭建本地生活 AI 搜索
人工智能·c#
!chen1 天前
C# + ViewFaceCore 快速实现高精度人脸识别
开发语言·c#
她说彩礼65万1 天前
WPF DataContext详解及用例
c#
她说彩礼65万1 天前
WPF Dispatcher和DispatcherObject
c#
“抚琴”的人1 天前
SqlSugar 文档
开发语言·数据库·c#·sqlsugar