学习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)、图表、媒体文件等,数据组织方式各异。通过大模型给出这两者的区别以供参考:

参考文献

1https://github.com/dotnet/Open-XML-SDK

2https://learn.microsoft.com/zh-cn/office/open-xml/open-xml-sdk

3https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.style?view=openxml-3.0.1

4https://blog.csdn.net/i042416/article/details/126228816

相关推荐
雨落倾城夏未凉5 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫6 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫7 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6257 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902117 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠8 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫10 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech10 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf12 天前
C#摸鱼实录——IoC与DI案例详解
c#
咕白m62512 天前
使用 C# 在 Excel 中应用多种字体样式
后端·c#