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

OpenXml中使用EmbeddedPackagePart类处理Word文档内嵌入的完整文件(大模型介绍说主要处理Office文件,但没有在其它学习文档或微软文档中找到相关说明),MainDocumentPart类的EmbeddedPackageParts属性保存所有的嵌入文件。以下图为例,向word文档中粘贴visio图形及另一个word文件,采用解压缩软件打开Word文档,其内的embeddings文件夹中保存嵌入文件的原始内容,而media文件夹内则保存每个嵌入office文件在word文档中的显示图标。


  MainDocumentPart类的EmbeddedPackageParts属性保存嵌入文件集合,其类型为IEnumerable <EmbeddedPackagePart>,EmbeddedPackagePart类存储嵌入文件,命名空间为DocumentFormat. OpenXml. Packaging。
  EmbeddedPackagePart类的RelationshipType属性为固定字符串,值为"http://schemas.openxmlformats.org/ officeDocument/2006/relationships/package",ContentType属性保存内容类型,可以据此分析文件类型,通过Uri属性可以获取嵌入文件的路径及文件名,下面的代码及截图用于获取word文档的嵌入文件列表。

csharp 复制代码
lstPackages.Items.Clear();

using (WordprocessingDocument doc = WordprocessingDocument.Open(txtFilePath.Text, false))
{
    MainDocumentPart mainPart = doc.MainDocumentPart;

    if (mainPart.EmbeddedPackageParts != null)
    {
        foreach (EmbeddedPackagePart packagePart in mainPart.EmbeddedPackageParts)
        {                       
            ListViewItem item = new ListViewItem(Convert.ToString(lstPackages.Items.Count + 1));
            item.SubItems.Add(mainPart.GetIdOfPart(packagePart));
            item.SubItems.Add(packagePart.ContentType);
            item.SubItems.Add(packagePart.Uri.IsAbsoluteUri? packagePart.Uri.AbsoluteUri: packagePart.Uri.OriginalString);

            lstPackages.Items.Add(item);
        }
    }
}

通过调用EmbeddedPackagePart类的GetStream函数可以获取文件流,可以将其保存到本地或另做他用,示例代码如下所示:

csharp 复制代码
EmbeddedPackagePart pPart=FindVisioPart( mainPart.EmbeddedPackageParts);

string ext = System.IO.Path.GetExtension(pPart.Uri.OriginalString);

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = $"{ext} files|*.{ext}";
if(saveFileDialog.ShowDialog() == DialogResult.OK)
{
    using (Stream embeddedStream = pPart.GetStream())
    {
        // 将流写入新文件
        using (FileStream fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create))
        {
            embeddedStream.CopyTo(fileStream);
        }
    }
}

参考文献

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 \[5\]https://blog.csdn.net/weixin_30521161/article/details/99076709

相关推荐
阿蒙Amon16 小时前
C#常用类库-详解YamlDotNet
开发语言·c#
E_ICEBLUE17 小时前
在 Python 中对比 Word 文档:自动生成修订报告
python·word
大模型RAG和Agent技术实践17 小时前
破译Word文档的“语义黑盒”:企业级DOCX RAG架构演进与全链路实战(完整源代码)
人工智能·架构·大模型·word·智能问答·rag
Sunsets_Red18 小时前
乘法逆元的 exgcd 求法
c++·学习·数学·算法·c#·密码学·信息学竞赛
唐青枫19 小时前
深入理解 C#.NET TaskScheduler:为什么大量使用 Work-Stealing
c#·.net
superior tigre19 小时前
word参考文献交叉引用的方法(包括批量把交叉引用改为上标、保留跳转功能到pdf)
word
人工智能AI技术19 小时前
Claude 3.7 企业版私有化部署技术验证:与 .NET 实战方案
人工智能·c#
呆子也有梦19 小时前
思考篇:积分是存成道具还是直接存数值?——ET/Skynet 框架下,从架构权衡到代码实现全解析
游戏·架构·c#·lua
我是唐青枫20 小时前
深入理解 C#.NET Task.Run:调度原理、线程池机制与性能优化
性能优化·c#·.net
阿蒙Amon20 小时前
C#常用类库-详解NModbus4
开发语言·c#