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に変換することでした。
- 埋め込まれたExcelワークシートのストリームをオープンするオープンXML SDKを取得する方法がありますが、明示的なトランスコーディングなし(SFXジップボリュームからアーカイブを圧縮する):
は、だから私は、次のような質問がありますか?
- 変更されたストリームをプレゼンテーションドキュメントに書き込むには、どのような方法が最適ですか?これは、ワークシート・データが更新され、ホスト文書に書き戻されるため、重要です。
- この問題を解決するもう少し洗練された方法がありますか?
注:ワークシートがプログラムでOpenXml SDKを使用してプレゼンテーションに埋め込まれている場合、この問題は発生しません。