2017-02-06 11 views
1

OpenXML 2.5 라이브러리를 사용하여 워드 템플릿 (. dotx)에서 .docx 파일을 만들려고합니다. 더 정확하게는 this을 따르려고하지만 파일 경로가 아닌 MemoryStream을 사용하여 문서를 열고 싶습니다.Open XML SDK - docx 홀더로 MemoryStream을 사용하여 템플릿 (dotx)에서 docx를 만듭니다.

위의 링크에서 접근 방법은 다음과 같습니다. 템플릿 파일을 디스크의 새 파일에 복사합니다. WordProcessingDocument으로 새 파일을 열고 해당 유형을 문서로 변경하고 템플리트에 대한 참조를 추가하십시오. (필자는 왜 이것이 필요한지 확실하지 않습니다 ...)

필요한 것은 무엇입니까? 바이트 배열로 DB에서 내 템플릿을 가져옵니다. 배열을 스트림에 복사하고 WordProcessingDocument으로 엽니 다. 위와 똑같은 일을하십시오. 디스크에 임시 파일을 사용하고 싶지 않습니다. 내가 이해하지 못하는 것은 새로운 문서에서 템플릿 파일을 참조해야하는 이유입니다. (사실, docx 아카이브에서 xml 파일을 검사하면 템플릿의 이름을 포함하는 xml 노드가 추가됩니다. 이유는 무엇입니까?)

내 문제는 MemoryStream을 사용하고 파일의 실제 경로가 아닌 경우 docx가 손상되었습니다.입니다. 일부 부품이 없거나 잘못되어 Microsoft Office에서이 파일을 열 수 없습니다. ". 임시 디스크 파일을 사용하면 작동합니다. 왜 이런 일이 발생합니까?

간체, 내 코드는 다음과 같습니다

byte[] result = null; 
byte[] templateBytes = System.IO.File.ReadAllBytes("template.dotx"); 
using (MemoryStream templateStream = new MemoryStream()) 

{ 
    templateStream.Write(templateBytes, 0, (int)templateBytes.Length); 

    using (WordprocessingDocument doc = WordprocessingDocument.Open(templateStream, true)) 
      { 
       doc.ChangeDocumentType(WordprocessingDocumentType.Document); 
       var mainPart = doc.MainDocumentPart; 

       //Here I should create an AttachedTemplate object and assign a relationship id to it, which also implies 
       //setting a "reference" to the template ? I'm not using files so there's nothing to "reference" anyway 
       // If it's doing more than just putting a visual reference to the template file, then why limit the way of referencing the template 
       // only by using the Uri to the file? Please take a look at the above link to see what I'm referring to. 

       //Write some text in the file .... 
       mainPart.Document.Save(); 

       File.WriteAllBytes("Result.docx", templateStream.ToArray()); 
      } 
    } 

이 나에게 손상된 DOCX 파일을 가져옵니다. MemoryStream에서클래스의 다른 생성자를 사용하여 새 docx 파일을 디스크로 열면 작동합니다. 나는 (메모리 스트림을 삭제 한 후 결과를 파일에 쓰려고하는 것처럼) 뭔가 잘못하고있는 것이 아니기 때문에 동일한 결과를 얻을 수있다.

내 코드가 잘못되었습니다.

감사

답변

1

당신이 내부 사용하여 블록의 출력 코드의 File.WriteAllBytes의 마지막 줄을하면 제대로 작동합니다. 바깥 쪽 블록의 닫는 중괄호 바로 앞에 그 줄을 넣으십시오.

+0

답변 주셔서 감사합니다. 늦었고 나는 그것을 보지 못했다. Open XML이 변경 사항을 저장하고 관리되지 않는 리소스를 닫거나 처분하는 등 문서의 using 블록을 종료하면됩니다. 그래서 나는 완전히 구원받지 못한 것을 열려고 시도했습니다. – darkdante