我有用户使用PowerPoint 2016生成的PPTX文件。幻灯片嵌入了需要进一步处理的Excel工作表。我在我的项目中使用Open Xml SDK v2.6.1。使用OpenXml SDK打开嵌入在PowerPoint 2016中的Excel工作表中的System.IO.FileFormatException
在嵌入式对象物流进入SpreadsheetDocument,使用下面的代码:
using (PresentationDocument pd = PresentationDocument.Open(pptxFile, true))
{
foreach (SlidePart slide in pd.PresentationPart.GetPartsOfType<SlidePart>())
{
foreach (EmbeddedObjectPart eoPart in slide.EmbeddedObjectParts)
{
using (SpreadsheetDocument sd = SpreadsheetDocument.Open(eoPart.GetStream(), true))
{
// do some work with worksheets
var count = sd.WorkbookPart.WorksheetParts.Count();
}
}
}
}
我得到以下异常:
System.IO.FileFormatException: File contains corrupted data.
at System.IO.Packaging.ZipPackage..ctor(Stream s, FileMode packageFileMode, FileAccess packageFileAccess)
at System.IO.Packaging.Package.Open(Stream stream, FileMode packageMode, FileAccess packageAccess)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(Stream stream, Boolean readWriteMode)
at DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(Stream stream, Boolean isEditable, OpenSettings openSettings)
at...
当我打开PPTX包,并在嵌入物的文件夹将oleObject1.bin重命名为oleObject1.zip,然后在WinRar中查看文件信息,我发现它是SFX Zip卷而不是ZipArchive。
我可以让SpreadsheetDocument打开嵌入式对象流的唯一方法是使用DotNetZip库将流转换为System.IO.Compression.ZipArchive。
所以,我有以下问题:
- 有没有办法让开放XML SDK来打开嵌入Excel工作表流,没有明确的转码(从SFX邮编卷ZIP压缩包)?
- 将修改后的流写回演示文稿文档的最佳方式是什么?这很重要,因为工作表数据将被更新并且必须写回主机文档。
- 有没有更好的方法来解决这个问题?
注意:当演示文稿中使用OpenXml SDK以编程方式嵌入工作表时,不会出现此问题。