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 に変換することでした。
だから私は次の質問があります:
- Open XML SDK を使用して、明示的なトランスコーディング (SFX Zip ボリュームから Zip アーカイブへ) を行わずに、埋め込まれた Excel ワークシート ストリームを開く方法はありますか?
- 変更されたストリームをプレゼンテーション ドキュメントに書き戻す最良の方法は何ですか? ワークシート データが更新され、ホスト ドキュメントに書き戻す必要があるため、これは重要です。
- この問題を解決する別のよりエレガントな方法はありますか?
注: この問題は、ワークシートがプレゼンテーションで OpenXml SDK を使用してプログラムで埋め込まれている場合には発生しません。