2016-11-10 17 views
0

PowerPoint 2016 사용자가 생성 한 PPTX 파일이 있습니다. 추가 처리를 위해 액세스해야하는 Excel 워크 시트가 포함되어 있습니다. 내 프로젝트에서 Open Xml SDK v2.6.1을 사용하고 있습니다. 나는 다음과 같은 예외가 얻을System.IO.FileFormatException OpenXml SDK가 포함 된 PowerPoint 2016에 포함 된 Excel 워크 시트 열기

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의 파일 정보를 보면 ZipArchive가 아니라 SFX Zip 볼륨이라는 것을 알 수 있습니다.

SpreadsheetDocument에서 포함 된 개체 스트림을 열 수있는 유일한 방법은 DotNetZip 라이브러리를 사용하여 스트림을 System.IO.Compression.ZipArchive로 변환하는 것이 었습니다.

  1. 포함 된 Excel 워크 시트 스트림을 열려면 열기 XML SDK를 얻을 수있는 방법이 있나요, 명시 적 트랜스 코딩없이 (SFX 우편 볼륨에서 아카이브를 우편하기) :

    그래서 나는 다음과 같은 질문이?

  2. 수정 된 스트림을 프레젠테이션 문서에 다시 쓰는 가장 좋은 방법은 무엇입니까? 이는 워크 시트 데이터가 업데이트되어 호스트 문서에 다시 기록되어야하기 때문에 중요합니다.
  3. 이 문제를 해결하기위한 좀 더 우아한 방법이 있습니까?

참고 : 프레젠테이션에서 OpenXml SDK를 사용하여 프로그래밍 방식으로 워크 시트를 포함하면이 문제가 발생하지 않습니다.

답변

0

WinRar와 같은 도구가 임베디드 오브젝트가 SFX zip 볼륨임을 보여 주지만 실제로는 MS-CFB (복합 파일 바이너리) 파일이라는 것을 알았습니다.

다음과 같은 방법으로 CFB 파일을 사용하여 작업 할 수 있습니다

  1. 윈도우 API : ole32.dll을가 CFB 파일을 읽고 쓸 수있는 방법을 제공합니다. 이 주제에 대해이 우수한 article을 찾았습니다.
  2. 일부 오픈 소스 옵션을 참조하는 유용한 리소스가 this page에 있습니다.

요약하면 다른 Office 문서에 포함 된 Office 문서를 포함 된 개체로 사용하기 위해 MS-CFB 형식으로 저장됩니다. 이러한 파일에 대한 읽기 및 쓰기는 Win API 또는 다른 방법을 사용하여 Open XML SDK 외부에서 수행해야합니다.