2016-11-10 46 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或其他選擇。

相關問題