0

PowerPoint 2016 を使用してユーザーが生成した PPTX ファイルがあります。スライドには、さらに処理するためにアクセスする必要がある Excel ワークシートが埋め込まれています。プロジェクトで Open Xml SDK v2.6.1 を使用しています。

次のコードを使用して、埋め込みオブジェクト ストリームを 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 パッケージを開き、embeddings フォルダーで oleObject1.bin を oleObject1.zip に名前変更し、WinRar でファイル情報を確認すると、ZipArchive ではなく SFX Zip ボリュームであることがわかります。

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

だから私は次の質問があります:

  1. Open XML SDK を使用して、明示的なトランスコーディング (SFX Zip ボリュームから Zip アーカイブへ) を行わずに、埋め込まれた Excel ワークシート ストリームを開く方法はありますか?
  2. 変更されたストリームをプレゼンテーション ドキュメントに書き戻す最良の方法は何ですか? ワークシート データが更新され、ホスト ドキュメントに書き戻す必要があるため、これは重要です。
  3. この問題を解決する別のよりエレガントな方法はありますか?

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

4

1 に答える 1