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

相关推荐
工程师00710 小时前
MQTT 概念详解与 C# 实战
开发语言·c#·mqtt通信
bugcome_com13 小时前
C# 字符串(String)详解与常用操作示例
c#
游乐码14 小时前
c#运算符重载
开发语言·c#
游乐码14 小时前
c#继承的原则
开发语言·c#
游乐码14 小时前
c#内部类和分部类
开发语言·c#
qq_5469372716 小时前
Word _ WPS 通用公文排版助手,支持标题、正文一键规范,发文机关、函线、装订线、公章、页码等常用部件一键解决
word·wps
qq_4542450317 小时前
GraphMindStudio 数据操作层解析:基于 SQLite 的封装与自动化存储
sqlite·c#
橙露18 小时前
Python 办公自动化:批量处理 Excel/Word/PPT 实战教程
python·word·excel
HY小海18 小时前
【Unity游戏创作】常见的设计模式
unity·设计模式·c#·游戏程序
专注VB编程开发20年18 小时前
C#,VB.NET如何用GPU进行大量计算,提高效率?
开发语言·c#·.net