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