Search

'SpreadsheetDocument'에 해당되는 글 1건

  1. 2010.07.26 OpenXML SDK 2.0 for Office을 이용해서 Excel 파일 내에 있는 이미지 추출하기 (1)


이번에 OpenXML을 써봤습니다. 예전에 System.IO.Package가지고 쌩쇼를 했는데...
요놈은 나름 괜찮더군요.. 그리고 오픈소스의 Package로도 작업했는데... 너무 빈약하더군요..요놈 강추입니다.

잘 아시겠지만, 요 SDK을 사용하면 오피스가 설치되어 있지 않아도 데이터를 핸들링할 수 있어서 서버 사이드 프로그램에 유용합니다.

1. 설치
일단, 아래 MS 사이트에서 SDK 다운로드 받으시구요.
해당 dll을 참조에 추가합니다.
(저 같은 경우는 C:\Program Files (x86)\Open XML SDK\V2.0\lib\DocumentFormat.OpenXml.dll) 에 있네요..

http://www.microsoft.com/downloads/details.aspx?familyid=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en#filelist

2. 네임스페이스(NameSpace) 추가

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

3. 실제 구현 샘플 코드(함수명 제외)

SpreadsheetDocument  _document = SpreadsheetDocument.Open(_filePath, false);  //  ReadOnly로 파일을 오픈함.
IEnumerable<Sheet> sheets = _document.WorkbookPart.Workbook.Descendants<Sheet>();
if (sheets.Count() == 0) return false;  // 시트가 없으므로 나감.

WorksheetPart   _worksheetPart = (WorksheetPart)_document.WorkbookPart.GetPartById(sheets.First().Id);  // 첫번째 시트에 해당하는 WorkPart을 가져온다.

 IEnumerable<ImagePart> imageParts = _worksheetPart.DrawingsPart.ImageParts;  // WorkPart에서 이미지 파트를 가져온다.
 if (imageParts.Count() == 0) return;

 ImagePart imagePart = imageParts.First(); //  guess.....First Picture 
 using (Stream stream = imagePart.GetStream())
 {
       using (Stream target = File.OpenWrite(targetPath))
       {
           CopyStream(stream, target);
         }
 }

// 해당 로컬에 파일을 쓴다.
  private static void CopyStream(Stream source, Stream destination)
 {
       byte[] buffer = new byte[0x1000];
       int read;
       while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
       {
             destination.Write(buffer, 0, read);
       }
  }