2016-11-10 12 views
0

PowerPoint 2016を使用するユーザーによって生成されたPPTXファイルがあります。スライドにはさらに処理するためにアクセスする必要があるExcelワークシートがあります。私は自分のプロジェクトでOpen XML SDK v2.6.1を使用しています。次のコードを使用して、SpreadsheetDocumentに埋め込まれたオブジェクトストリームを渡すことでSystem.IO.FileFormatExceptionはOpenXml SDKを使用してPowerPoint 2016に埋め込まれたExcelワークシートを開きます

:私はPPTXパッケージを開き、埋め込みフォルダにすると

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... 

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(); 
     } 
    } 
    } 
} 

を私は次の例外を取得しますoleObject1.binの名前をoleObject1.zipに変更して、WinRarのファイル情報を参照してください。これは、SFXのZipボリュームであり、ZipArchiveではありません。

埋め込みオブジェクトストリームを開くためにSpreadsheetDocumentを取得できる唯一の方法は、DotNetZipライブラリを使用してストリームをSystem.IO.Compression.ZipArchiveに変換することでした。

  1. 埋め込まれたExcelワークシートのストリームをオープンするオープンXML SDKを取得する方法がありますが、明示的なトランスコーディングなし(SFXジップボリュームからアーカイブを圧縮する):

    は、だから私は、次のような質問がありますか?

  2. 変更されたストリームをプレゼンテーションドキュメントに書き込むには、どのような方法が最適ですか?これは、ワークシート・データが更新され、ホスト文書に書き戻されるため、重要です。
  3. この問題を解決するもう少し洗練された方法がありますか?

注:ワークシートがプログラムでOpenXml SDKを使用してプレゼンテーションに埋め込まれている場合、この問題は発生しません。

答えて

0

最終的にWinRarのようなツールで埋め込みオブジェクトがSFX zipボリュームであることがわかりましたが、実際にはMS-CFB(複合ファイルバイナリ)ファイルです。

次の方法で、CFBファイルを扱うことができます:

  1. のWindows API:OLE32.DLLはCFBファイルを読み書きするためのメソッドを提供します。このトピックについては、この優秀なarticleが見つかりました。
  2. this pageにはいくつかのオープンソースオプションを参照するのに役立つリソースがいくつかあります。

最終行は、埋め込みオブジェクトとして他のオフィス文書に埋め込まれたオフィス文書を処理するために、MS-CFB形式で保存されます。これらのファイルの読み書きは、Win APIやその他の方法を使用してOpen XML SDKの外部で行う必要があります。

関連する問題