2016-11-10 47 views
0

我有用户使用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。

所以,我有以下问题:

  1. 有没有办法让开放XML SDK来打开嵌入Excel工作表流,没有明确的转码(从SFX邮编卷ZIP压缩包)?
  2. 将修改后的流写回演示文稿文档的最佳方式是什么?这很重要,因为工作表数据将被更新并且必须写回主机文档。
  3. 有没有更好的方法来解决这个问题?

注意:当演示文稿中使用OpenXml SDK以编程方式嵌入工作表时,不会出现此问题。

回答

0

我终于明白,尽管像WinRar这样的工具显示嵌入对象是SFX zip卷,但它实际上是一个MS-CFB(复合文件二进制文件)文件。

您可以通过以下方式与CFB文件的工作:

  1. 的Windows API:OLE32.DLL提供方法来读取和写入CFB文件。我在这个话题上发现了这个优秀的article
  2. this page上有一些有用的资源引用了一些开源选项。

底线,为了与嵌入在其他办公文件中作为嵌入对象的办公文件一起工作,以MS-CFB格式保存。读取和写入这些文件需要在Open XML SDK之外完成,可以使用Win API或其他选择。

相关问题