Open XML 개체 모델을 사용하여  서버측 문서 생성 솔루션 구축 (1부)

개요 : Open XML 아키텍처와 WordprocessingML 기본을 학습합니다. 새로운 Open XML 개체 모델을 사용하여, 문서 패키지를 생성하고, 문서 조작의 장점을 보여줍니다.

Erika Ehrli, Microsoft Corporation

2007 년 8 월

적용 대상 : 2007 Microsoft Office Suites, Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007

목차

  • 개요

  • Open XML 패키지 아키텍처 이해

  • 서버측 문서 통합 솔루션 아키텍처

예제의 다운로드 :2007 Office Sample: Building a Server-Side Document Generation Solution Using the Open XML Object Model

2부 읽기 : Open XML 개체 모델을 사용한  서버측 문서 생성 솔루션 구축 (파트 2/2)

개요

정보시스템에서 문서 생성은 가장 일반적인  요구 기능의 하나입니다. 모든 기업에서는 매일 다양한 기간 업무 (LOB) 시스템에 저장된 데이터를 기반으로, 기업 의사결정자가 유용한  정보를 취득할 수 있는 몇 백만가지 리포트를 생성합니다.

기업은 비즈니스 프로세스 개선, 워크플로 최적화 및 비즈니스를 개선하는 정보 출력에 소요되는 시간과 경비 절감에 도움이 되는 소프트웨어 기반의 솔루션을 원합니다. 템플릿 기반의  고객 대상 청구서 법적 서류, 메모, 편지 등의 문서를 생성할 수 있는 솔루션이 필요합니다.

이들 기업에서는 웹 기반의 응용 프로그램 또는 SharePoint 사이트를 프론트엔드 웹 서버로서 사용하여  정보를 다루는 경우가 있습니다. 이러한 응용 프로그램에서는 웹 기반의 리포트를 Microsoft Office Word 2007 또는 Microsoft Office Excel 2007 에 export하는 방법이 필요합니다.

지금까지는 서버에서 Microsoft Office 문서를 생성이 어려웠습니다.  이전 버전의 Microsoft Office는 오래된 이진 형식을 기반으로 Microsoft Office 문서를 조작하거나 생성하려면, 자동화를 사용해야 하는데,  Microsoft Office의 이전 버전에서는 지원되지 않습니다.

2007 Microsoft Office system 는 Word 문서 Excel 워크시트 및 Microsoft Office PowerPoint 2007 프레젠테이션을 서버측에서 프로그램 생성에 도움이 되는 새로운 기능이 있습니다. 그 기능이 Open XML 형식입니다.

 「Open XML 개체 모델을 사용한  서버측 문서 생성 솔루션 구축 (파트 1/2)」에서는 Open XML 형식과 Open XML 개체 모델을 사용하여  Microsoft Office 문서를 조립하기 위해 Microsoft .NET Framework 기반  서버측 솔루션을 설계하고 구축하는 방법을 확인합니다. 여기에서는 Open XML 형식 아키텍처에 대해 설명하고 Open XML 개체 모델을 사용한 문서 패키지 생성, 문서 조작 및 WordprocessingML 코드 생성의 기본 개념을 설명합니다. 또, 서버측 문서 통합 솔루션 아키텍처를 해설합니다.

2부 「Open XML 개체 모델을 사용한  서버측 문서 생성 솔루션 구축 (파트 2/2)」에서는 비즈니스 시나리오를 제시하고 Microsoft ASP.NET 2.0 응용 프로그램을 사용하여  Word 2007 의 판매 보고서를 생성하는 방법을 살펴봅니다.

다운로드 「2007 Office Sample: Building a Server-Side Document Generation Solution Using the Open XML Object Model (영어)」에서는 Open XML 개체 모델을 사용하여  서버측 응용 프로그램에서 문서를 생성하는 Microsoft Visual Basic 2005 로 Microsoft Visual C#  예제파일을 제공합니다.

Open XML 패키지 아키텍처 이해

Open XML 패키지 사양에서는 문서를 XML 파일 (문서 파트)의 집합으로 정의하고 문서 파트간의 관계를 정의합니다. 대부분의 문서 파트는 응용 프로그램 데이터, 메타데이터 및 고객 데이터를 기술하고 컨테이너파일 (패키지) 안에 저장된 XML 파일입니다. 컨테이너 패키지에는 이미지를 나타내는 이진 파일, 문서에 포함된 OLE 개체 등, 다른 XML 이외의 파트도 포함되어 있습니다. 또, 문서 파트간의 관계를 지정하는 관계 파트도 있습니다. 관계는 2007 Microsoft Office system 파일 구조를 보여줍니다.

문서 파트가 파일 컨텐츠를 구성하는 한편, 관계는 문서 파트의 구성을 기술합니다. 또, 관계는 내부 문서 참조 뿐만이 아니라, 외부 리소스에의 링크도 주의해야 합니다. 예를 들어, 문서 안의 링크된 이미지 또는 개체는 관계를 사용해도 나타내집니다. 따라서 외부 리소스에의 링크는 간단하게 검색, 검사 및 변경할 수 있습니다.

Word 2007에서 패키지는 문서를 나타냅니다. 패키지에는 문서를 구성하는 파트가 있습니다. 예를 들어, Word 2007 파일에는 다음의 폴더와 파일을 포함합니다. (다만, 이것만으로 한정되지 않습니다).

  • docProps 폴더.응용 프로그램의 속성 파트를 포함합니다.

  • App.xml 파일.응용 프로그램 고유의 속성을 포함합니다.

  • Core.xml 파일.Open Packaging Convention 문서 형식 기반의 모든 파일 공통 파일 속성을 포함합니다.

  • _rels 폴더.특정 문서 파트의 관계 파트를 저장합니다.

  • .rels 파일.문서 구조를 정의하는 관계를 기술하는 관계 파트.

  • document.xml.Word XML 형식 파일로 유일한 필수 파트. 파트에는 문서 컨텐츠를 정의하는 XML 마크 업 (WordprocessingML)을 포함합니다.

  • [Content_Types].xml.패키지에 포함된 각 파트의 컨텐츠 유형을 기술합니다.

  • styles.xml 파일.문서에 대한 스타일 정의를 포함합니다.

그림 1. 간단한 문서 디렉터리 구조

단순한 문서의 디렉터리 구조

OpenXML 문서는 Open Packaging Convention (OPC) 패키지입니다. 모든 문서 파트는 업계표준의 ZIP 형식에서 컨테이너파일 또는 패키지에 저장됩니다. 이 패키지에는 문서에 포함된 모든 컨텐츠가 저장 유지됩니다.

Open XML 형식 아키텍처의 자세한 내용은 「Office (2007) Open XML 파일 형식 개요」를 참조해 주세요.

Word 2007 XML 형식 아키텍처의 자세한 내용은 「튜토리얼 : Word 2007 XML 형식」을 참조해 주세요.

WordprocessingML 기본

Word 2007 문서는 WordprocessingML 마크 업을 사용하여  정의합니다. WordprocessingML 는 오래된 이진 형식을 기반으로  생성 되었습니다. WordprocessingML에서는 마크업 언어를 사용하여 문서의 텍스트 컨텐츠와 서식을 기술합니다. WordprocessingML 는 계층 구조에서는 데이터를 나타내지 않습니다. 그 대신, Word 문서는 스토리 (메인 문서 주석, 머리글) 및 속성 (스타일, 번호 설정 정의)의 집합에서 구성됩니다. 각 스토리에는 구조화 문서 태그 (SDT)를 사용하여  정의된 특정 종류의 구조가 포함됩니다.

WordprocessingML에서 스토리는 사용자를 입력할 수 있는 컨텐츠의 고유 영역으로 정의됩니다. WordprocessingML 문서로 가장 중요한 스토리는 메인 문서 스토리입니다. 여기에는 문서의 주요 컨텐츠가 들어갑니다.

다음은 Word 2007 문서의 document.xml 파트로 일반적인 WordprocessingML 마크 업의 예입니다.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">  <w:body>
    <w:p>
      <w:r>
        <w:t>I saw a rabbit today.</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:document>

XML 선언, 루트 요소, 네임 스페이스

첫 번째 줄은 모든 XML 파일에 필요한 XML 선언을 나타냅니다.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
Note중요 :

Word에서는 UTF-8 앤코딩을 지원합니다. WordprocessingML 를 생성하는 경우는 반드시 UTF-8 앤코딩을 사용하여  주세요. UTF-8 앤코딩의 자세한 내용은 「UTF-8 and Unicode Standards (영어)」를 참조해 주세요.

두번째 줄은 문서 루트 요소입니다. XML 문서에는 루트 요소가 하나만 포함되어야 합니다. 루트 요소는 파일 요소와 특성에 대한 네임 스페이스를 정의합니다.

<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
Note메모 :

WordprocessingML 문서로 사용하는 네임 스페이스의 세부 사항목록은 「Ecma Office Open XML File Formats Standard Final draft - Part 4 - Markup Language Reference (영어)」를 참조해 주세요.

메인 문서 스토리 파트, 단락, run, 텍스트

메인 문서 스토리는 본문 요소 내에 저장됩니다. HTML 를 비슷하고, Word 문서 컨텐츠는 <w:body> 태그내에 들어갑니다.

단락 <w:p> 은 WordprocessingML 문서로 가장 기본적인 단위입니다. 단락 요소는 본문 요소내에 있기 위해 메인 문서 스토리의 일부가 됩니다. 단락 요소에는 세가지 정보가 들어갑니다.

  • 단락 속성

  • 인라인 컨텐츠

  • 문서 병합과 비교 조작에 사용하는 수정 ID (생략 가능)

또, 다음과 같은 인라인 구조를 넣을 수도 있습니다.

  • <w:t> 텍스트 영역을 포함한 run <w:r>

  • 텍스트블록 또는 인라인 텍스트로 사용할 수 있는 사용자 지정 마크 업

  • 주석, 변경 저널, 책갈피 등의 주석

  • DrawingML 요소

  • 날짜, 페이지번호, 문서 제목, 생성자 등의 필드

  • 하이퍼 링크

단락은 차단 수준 컨텐츠를 사용할 수 있는 장소에 둘 수 있습니다.

  • 스토리내의 최상위 (머리글, 바닥글, 메인 문서)

  • 테이블 셀내에 중첩

  • 구조화 문서 태그내 또는 주석에 중첩

    <w:p>
      <w:r>
        <w:t>I love coffee.</w:t>
      </w:r>
    </w:p>

테이블

테이블은 행과 열에 정렬된 단락의 집합입니다. WordprocessingML 테이블에는 차단 수준의 컨텐츠가 포함되어 <w:tbl> 요소를 사용하여  지정합니다. 이 요소는 HTML 의 <table> 요소와 비슷합니다.

WordprocessingML 테이블에는 4 종류의 컨텐츠가 들어갑니다.

  • 속성.<w:tblPr> 섹션에서는 테이블 고유의 속성을 지정합니다. 크기, 배포, 텍스트 되풀이 스타일, 괘선, 쉐도우 등의 속성을 정의할 수 있습니다.

  • 그리드.테이블로 셀의 레이아웃에 사용하는 가상 그리드를 정의합니다. <w:tblGrid> 요소를 사용하여 테이블에 그리드를 정의합니다.

  • .<w:tr> 요소는 테이블  행을 정의합니다. 이 요소는 HTML 의**<tr>** 요소와 비슷합니다.

  • .<w:tc> 요소는 테이블  셀을 정의합니다. 이 요소는 HTML 의 <td> 요소와 비슷합니다.

다음의 예제코드에서는 테이블  속성과 컨텐츠를 정의합니다.

                <w:tbl>
   <w:tblPr>
   <w:tblStyle w:val="LightGrid-Accent2" />
     <w:tblW w:w="0" w:type="auto" />
     <w:tblLook w:val="04A0" />
   </w:tblPr>
   <w:tblGrid>
     <w:gridCol w:w="2394" />
   </w:tblGrid>
   <w:tr w:rsidR="00D66682" w:rsidTr="00616703">
     <w:trPr>
       <w:cnfStyle w:val="100000000000" />
     </w:trPr>
     <w:tc>
       <w:tcPr>
         <w:tcW w:w="2394" w:type="dxa" />
       </w:tcPr>
       <w:p>
         <w:r>
           <w:t>WordprocessingML is fun</w:t>
         </w:r>
       </w:p>
     </w:tc>
   </w:tr>
</w:tbl>
Note메모 :

<w:p> 단락 요소에 <w:tbl> 요소를 넣을 수 없습니다.

스타일 파트, 스타일, 서식

"스타일" ** 파트는 1 개의 논리 단위로서 적용할 수 있는 서식 속성의 특정 값 집합을 정의합니다. 예를 들어, Word 2007 의 Normal 스타일에서는 다음의 서식 속성을 정의합니다.

  • 폰트 = Calibri (body)

  • 폰트 크기 = 11 포인트

  • 폰트 언어 = Word 의 기본값 (사용자의 설정 값)

    배포 = 왼쪽 정렬

  • 행간 = 1 행

  • 단락의 첫 줄이나 마지막 줄 분리 방지

Open XML 패키지 안에서 스타일은 <style> 요소의 스타일 정의가 들어간 고유 파트 (styles.xml)에 저장됩니다.

Note메모 :

다음의 코드 예제에는 온라인으로 표시했을 때에 보기 쉽도록 줄 바꾸기가 추가됩니다. 실제로 코드로 사용하기 전에 줄 바꾸기를 삭제해야 합니다.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:styles xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:docDefaults>
    ...
</w:docDefaults>
  <w:latentStyles w:defLockedState="0" w:defUIPriority="99" w:defSemiHidden="1" w:defUnhideWhenUsed="1" w:defQFormat="0" w:count="267">
    <w:lsdException w:name="Normal" w:semiHidden="0" w:uiPriority="0" w:unhideWhenUsed="0" w:qFormat="1" />
    <w:lsdException w:name="heading 1" w:semiHidden="0" w:uiPriority="9" w:unhideWhenUsed="0" w:qFormat="1" />
    <w:lsdException w:name="Title" w:semiHidden="0" w:uiPriority="10" w:unhideWhenUsed="0" w:qFormat="1" />
    <w:lsdException w:name="Light List Accent 1" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0" />
  </w:latentStyles>
  <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
    <w:name w:val="Normal" />
    <w:qFormat />
  </w:style>
  <w:style w:type="character" w:default="1" w:styleId="DefaultParagraphFont">
    ...
</w:style>
  <w:style w:type="table" w:default="1" w:styleId="TableNormal">
    ...
</w:style>
  <w:style w:type="numbering" w:default="1" w:styleId="NoList">
    ...
</w:style>
</w:styles>

스타일은 문서의 외관을 정의합니다. styles.xml 파트에 스타일 집합을 정의합니다. 테이블, 단락, 단락 번호 등의 서식 설정에 사용하는 경우, 스타일의 ID 를 사용하여  참조를 추가합니다.

<w:pPr>
        <w:spacing w:before="200" w:after="0" />
      </w:pPr>
      <w:pPr>
        <w:pStyle w:val="Heading 3" />
      </w:pPr>
      <w:r>
        <w:rPr>
          <w:b />
          <w:sz w:val="26" />
        </w:rPr>
        <w:t>Sales by Territory - Northwest</w:t>
      </w:r>
    </w:p>

Open XML에서 스타일을 사용하려면, 다음 4가지 작업을 실시해야 합니다.

  1. 문서 패키지 MySampleDocument.docx\word\styles.xml 에 스타일 파트를 생성합니다. 이 파일에는 전의 코드에 나타낸 스타일 마크 업 정의가 들어가 있습니다.

    <w:style w:type="paragraph" w:default="1" w:styleId="MyStyle">
        ...
    </w:style>
    
  2. MySampleDocument.docx\word\_rels\document.xml.rels 파일에 관계를 정의합니다.

    <Relationship Id="rId1" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml" />
    
  3. MySampleDocument.docx\[Content_Types].xml 파일에 스타일 컨텐츠 유형을 정의합니다.

    <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" />
    
  4. 정의된 스타일 참조를 추가하고, 문서로 스타일을 사용합니다.

    <w:pPr>
         <w:pStyle w:val="MyStyle" />
       </w:pPr>
       <w:r>
         <w:rPr>
           <w:b />
         </w:rPr>
         <w:t>My text</w:t>
       </w:r>
    </w:p>
    

이미지 파트와 이미지

이미지는 DrawingML 네임 스페이스에 속합니다. DrawingMLMain 네임 스페이스에서는 모든 종류의 DrawingML 개체 (그래프, 그림, 도형, 이미지 등)에 대해서 모든 기본 구조를 정의합니다. 이미지를 문서에 삽입하려면, <w:drawing> 요소를 run <w:r> 요소내에 삽입해야 합니다.

<pic:pic> 요소는 이미지를 정의하고 <p:blipFill> 요소는 이미지 개체의 그림 채우기 종류를 지정합니다.

<w:p>
   <w:r><w:drawing>
       <wp:inline xmlns:wp="https://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
         <wp:extent cx="1628936" cy="733586" />
         <wp:docPr name="image.jpeg" id="1" />
         <a:graphic xmlns:a="https://schemas.openxmlformats.org/drawingml/2006/main">
           <a:graphicData uri="https://schemas.openxmlformats.org/drawingml/2006/picture">
             <pic:pic xmlns:pic="https://schemas.openxmlformats.org/drawingml/2006/picture">
               <pic:nvPicPr>
                 <pic:cNvPr id="0" name="image.jpeg" />
                 <pic:cNvPicPr />
               </pic:nvPicPr>
               <pic:blipFill>
                 <a:blip r:embed="rId2" xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships" />
                 <a:stretch>
                   <a:fillRect />
                 </a:stretch>
               </pic:blipFill>
               <pic:spPr>
                 <a:xfrm>
                   <a:off x="0" y="0" />
                   <a:ext cx="1630190" cy="734151" />
                 </a:xfrm>
                 <a:prstGeom prst="rect" />
               </pic:spPr>
             </pic:pic>
           </a:graphicData>
         </a:graphic>
       </wp:inline>
     </w:drawing>   </w:r>
</w:p>

<a:blip> 요소의 r:embed 특성을 사용하여  정의된 관계로 실제의 이미지 참조를 추가합니다. 관계는 패키지의 이미지 파트를 가리킵니다.

Open XML에서 문서 파트에 이미지를 추가하여, 문서 컨텐츠로서 보여주기 위해 다음의 4가지 작업을 실시해야 합니다.

  1. 문서 패키지 MySampleDocument.docx \media\myimage.jpg 에 이미지 파트를 생성합니다.

  2. MySampleDocument.docx\word\_rels\document.xml.rels 파일에 관계를 정의합니다.

    <Relationship Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="/media/image.jpg" Id="rId2" />
    
  3. MySampleDocument.docx\[Content_Types].xml 파일에 이미지 컨텐츠의 종류를 정의합니다.

    <Default Extension="jpg" ContentType="image/jpeg" />
    
  4. 마지막에 문서에 이미지를 삽입하기 위해 run <w:r> 요소내에 <w:drawing> 요소를 삽입해야 합니다.

    <w:p>
       <w:r>
         <w:drawing>
           <wp:inline xmlns:wp="https://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
             <wp:extent cx="1628936" cy="733586" />
             <wp:docPr name="image.jpeg" id="1" />
             <a:graphic xmlns:a="https://schemas.openxmlformats.org/drawingml/2006/main">
               <a:graphicData uri="https://schemas.openxmlformats.org/drawingml/2006/picture">
                 <pic:pic xmlns:pic="https://schemas.openxmlformats.org/drawingml/2006/picture">
                   <pic:nvPicPr>
                     <pic:cNvPr id="0" name="image.jpeg" />
                     <pic:cNvPicPr />
                   </pic:nvPicPr>
                   <pic:blipFill>
                     <a:blip r:embed="rId2" xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships" />
                     <a:stretch>
                       <a:fillRect />
                     </a:stretch>
                   </pic:blipFill>
                   <pic:spPr>
                     <a:xfrm>
                       <a:off x="0" y="0" />
                       <a:ext cx="1630190" cy="734151" />
                     </a:xfrm>
                     <a:prstGeom prst="rect" />
                   </pic:spPr>
                 </pic:pic>
               </a:graphicData>
             </a:graphic>
           </wp:inline>
         </w:drawing>
       </w:r>
    </w:p>
    

고급 WordprocessingML

Word 2007에서는 WordprocessingML 마크 업을 사용하여  WYSIWYG (what you see is what you get) 문서를 생성할 수 있습니다. 이것은 2007 Microsoft Office System에서 제공되는 강력한 기능입니다. WordprocessingML 마크 업을 사용하여 일련 번호 목록, 사용자 지정 컨텐츠 XML, 테마, 바닥글, 머리글등이 들어간 복잡한 문서를 생성할 수 있습니다.

WordprocessingML 마크 업을 사용한 고급 문서 생성의 자세한 내용은 「Ecma Office Open XML File Formats Standard Final draft - Part 4 - Markup Language Reference (영어)」를 참조해 주세요. 이 문서에는 WordprocessingML 의 스키마 정의가 기재되어 있습니다. 이것은 Word 2007 문서를 프로그램으로 생성하려면 꼭 필요한 레퍼런스입니다. 이 가이드에는 SpreadsheetML, PresentationML, DrawingML 및 그 외의 Microsoft Office 마크 업 스키마의 레퍼런스 백서도 있습니다.

Open XML 개체 모델을 사용한 문서 패키지 조작

수동으로 문서 패키지를 조작하려면, 표준 ZIP 유틸리티를 사용합니다. 또,Open XML Package Explorer,XMLSpy 등의 도구를 사용하여 문서 패키지에 저장된 파일 컨텐츠 (마크 업)를 조사 조작할 수도 있습니다.

또한 Microsoft 의 개발자 대상 응용 프로그램, 타사제품 솔루션 또는 오픈 소스 API 를 사용하여 프로그램으로 문서 패키지와 문서 컨텐츠를 조작할 수도 있습니다.

.NET Framework 기반  문서 통합 솔루션을 구축 한 경우,Microsoft SDK for Open XML Formats 의 사용을 검토해 주세요. 이 소프트웨어 개발 킷 (SDK)에 포함된 Open XML 개체 모델을 사용하면, 패키지를 생성하여, 패키지를 구성하는 파일을 조작할 수 있습니다.

Open XML 개체 모델은 간단하게 사용할 수 있습니다. 프로젝트 또는 응용 프로그램으로 Microsoft.Office.DocumentFormat.OpenXml.dll 에의 참조를 추가합니다. 또, Microsoft Office Developer Center에서 「Microsoft SDK for Open XML Formats 기술 프리뷰」를 다운로드할 수도 있습니다.

응용 프로그램의 비즈니스 논리 층을 생성 할 때는 Open XML 개체 모델을 사용하는 리포트 생성 도우미 클래스를 독자적으로 생성하는 것을 검토해 주세요. Open XML 개체 모델을 사용하는 것으로, 문서 패키지와 그 파트의 생성과 조작에 필요한 코드가 아주 간략해집니다. 다만, 생성이 필요한 마크 업 코드의 양은 문서 컨텐츠의 복잡함에 따라서 다릅니다. 다른 마크업 언어와 같이 WordprocessingML 는 장황합니다.

다음의 코드 예제에서는 Visual C# 와 Microsoft Visual Basic 2005 의 코드를 사용하여  메인 문서 파트와 간단한 WordprocessingML 컨텐츠를 가지는 간단한 문서 패키지를 생성하는 방법을 보여줍니다.

// Create a package as a Word document.
public static void CreateNewWordDocument(string document)
{
   using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
   {
      // Set the content of the document so that Word can open it.
      MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

      SetMainDocumentContent(mainPart);
   }
}

// Set content of MainDocumentPart.
public static void SetMainDocumentContent(MainDocumentPart part)
{
   const string docXml =
@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">
    <w:body><w:p><w:r><w:t>I love coffee</w:t></w:r></w:p></w:body>
</w:document>";

    using (Stream stream = part.GetStream())
    {
       byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
       stream.Write(buf, 0, buf.Length);
    }
}
Public Sub CreateNewWordDocument(ByVal document As String)
   Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Create(document,
       WordprocessingDocumentType.Document)
   Using (wordDoc)
      ' Set the content of the document so that Word can open it.
      Dim mainPart As MainDocumentPart = wordDoc.AddMainDocumentPart
      SetMainDocumentContent(mainPart)
   End Using
End Sub

Public Sub SetMainDocumentContent(ByVal part As MainDocumentPart)
   Const docXml As String = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" & _
   "<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">" & _
   "<w:body><w:p><w:r><w:t>I love coffee</w:t></w:r></w:p></w:body></w:document>"
   Dim stream1 As Stream = part.GetStream
   Dim utf8encoder1 As UTF8Encoding = New UTF8Encoding()
   Dim buf() As Byte = utf8encoder1.GetBytes(docXml)
   stream1.Write(buf, 0, buf.Length)
End Sub

Microsoft SDK for Open XML Formats」의 「방법」에는 문서 패키지와 파트 조작  방법을 보여주는 다른 코드 예제가 있습니다.

이전 버전과의 호환성

일반적으로, 문서 통합 솔루션에는 Microsoft Office System 의 이전 버전과의 하위호환성이 필요합니다. Open Packaging Convention 에 따라서 생성된 문서 패키지의 형식은 Microsoft Office 의 이전 버전에서 사용된 오래된 이진 형식과는 다릅니다.

Open XML 형식을 사용하여  2007 Microsoft Office 문서를 생성했을 경우, Word/Excel/PowerPoint 2007 파일 형식용 Microsoft Office 호환기능 팩 을 다운로드하여 설치하면 Microsoft Office 의 이전 버전에서 생성된 파일 오픈, 편집 및 저장 할 수 있습니다. 이것은 무료 다운로드 가능하며, Microsoft Office 2000, Microsoft Office XP 또는 Microsoft Office 2003 의 Word, Excel 및 PowerPoint 에 Open XML 지원을 추가합니다.

서버측 문서 통합 솔루션 아키텍처

Microsoft Office 플랫폼에서 개발된 솔루션은 Office Business Applications (OBA)으로 분류할 수 있습니다. OBA 솔루션의 일반적 작업의 하나는 문서 통합입니다. 문서 통합에서는 다른 시스템의 데이터를 사용하여  문서를 자동 생성하거나 문서를 처리하여 데이터를 추출합니다.

목적에 따라 다양한 Microsoft Office 프로그램, 도구 및 기술을 조합할 수 있습니다. Microsoft Visual Studio 2005 Tools for Office, 확장 가능한 Microsoft Office Fluent 사용자 인터페이스, Microsoft SharePoint 제품과 기술 및 Office Open XML 형식을 사용하여 다양한 구성요소를 요약, 사용자 지정 OBA 솔루션을 생성할 수 있습니다.

초기 서버측 문서 통합 솔루션에서는 LOB 시스템과 데이터를 사용자 대상의 고성능프레젠테이션 층( layer)생성에 도움이 되는 사용자 지정 LOB 소프트웨어와 구성요소와 통합합니다.

그림 2. 서버측 문서 통합 솔루션 아키텍처 개요

Conceptual architecture of a server-side document

서버측 문서 통합 솔루션은 다음의 4 개 층으로 나눠집니다.

  • LOB 시스템과 데이터

  • LOB 소프트웨어와 구성요소

  • 프론트엔드 웹 서버

  • 클라이언트 응용 프로그램

LOB 시스템과 데이터

LOB 시스템 및 데이터는 응용 프로그램의 데이터 층 논리를 캡슐화합니다. 기업에서는 SAP, Siebel, Microsoft Dynamics, SharePoint 사이트 또는 그 외의 타사제품 응용 프로그램 등, 다른 크로스 플랫폼 LOB 시스템에 데이터를 저장 할 수 있습니다. 또, 데이터는 Microsoft SQL Server, Oracle 등의 데이터베이스 시스템에 저장할 수도 있습니다.

사용자 지정 데이터 도우미 클래스를 생성하여, 다양한 LOB 시스템에서 데이터를 취득하는 프로세스를 캡슐화할 수 있습니다. 데이터 도우미 클래스에서는 Web 서비스, 타사제품 API 또는 ODBC 접속을 사용하여  다양한 LOB 백 엔드 시스템과 데이터에 액세스 할 수 있습니다.

LOB 소프트웨어 또는 구성요소

LOB 소프트웨어 및 구성요소는 응용 프로그램의 비즈니스 논리층을 캡슐화합니다. 사용자 지정 클래스를 생성하여, 기존의 LOB 서비스를 사용할지 다른 LOB 서비스를 생성하는 비즈니스 프로세스와 워크플로를 정의할 수 있습니다. 또, 서비스 지향의 아키텍처로 응용 프로그램을 사용할 수도 있습니다. 사용자 지정 리포트 생성 클래스를 생성하여, 문서 통합 프로세스를 캡슐화할 수 있습니다. 이러한 클래스에서는 Open XML 개체 모델을 사용하여 문서 패키지를 생성하여 LOB 데이터에 기반하는 문서 컨텐츠를 출력합니다.

Note메모 :

Microsoft Office 문서를 생성하기 위해 서버에 2007 Microsoft Office system 를 설치할 필요는 없습니다. Open XML 형식에 의해, 자동화를 사용하지 않고 문서를 생성 및 조작할 수 있습니다.

프론트엔드 웹 서버

프론트엔드 웹 서버는 응용 프로그램의 생산성 층을 캡슐화합니다. SharePoint 사이트 또는 ASP.NET 응용 프로그램을 사용하여  사용자 지정 리포트 처리, 필터링, 선택 및 정의 실행 가능합니다. 프론트엔드 웹 서버로, 단추 또는 정의된 사용자 지정 액션이 있는 Web 파트 또는 Web 페이지를 제공해 사용자가 Word, Excel 또는 PowerPoint 에 리포트를 export 할 수 있도록  할 수 있습니다.

클라이언트 응용 프로그램

클라이언트 응용 프로그램은 솔루션의 프레젠테이션 층을 나타냅니다. 서버측 솔루션에서 문서를 생성한 후, Microsoft Office 프로그램을 사용하여 리포트를 열어, 문서 조작할 수 있습니다.