2017-09-05 7 views
1

다른 유사한 질문을 읽었으니 시작하겠습니다. 그러나 아래에 나와있는 해결책은 저에게 맞지 않습니다.OpenXml을 사용하여 워드 문서 (docx) 만들기

.NET 코어 및 OpenXMl (DocumentFormat.OpenXml 2.7.2 Nuget 패키지 사용)을 사용하여 워드 문서 (docx)를 만들려고합니다. 사소한 것처럼 보이지만 어떻게 든 작동하지 않습니다. 문서를 열려고하면 파일이 손상되거나 잘린 또는 잘못된 형식이라는 오류가 발생합니다. 여기

(나는 수많은 튜토리얼에서 그것을 발견) 내 코드입니다 : 이런 식으로 저장

using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Wordprocessing; 
using System.IO; 

public Stream GetDocument() 
     { 
      var stream = new MemoryStream(); 

      using (WordprocessingDocument doc = WordprocessingDocument.Create(stream, WordprocessingDocumentType.Document, true)) 
      { 
       MainDocumentPart mainPart = doc.AddMainDocumentPart(); 

       new Document(new Body()).Save(mainPart); 

       Body body = mainPart.Document.Body; 
       body.Append(new Paragraph(
          new Run(
           new Text("Hello World!")))); 

       mainPart.Document.Save(); 

      } 
      stream.Seek(0, SeekOrigin.Begin); 

      return stream; 

     } 

광고 :

public static void Test() 
     { 
      DocxWriter writer = new DocxWriter(); 

      string filepath = Directory.GetCurrentDirectory() + @"/test.docx"; 

      var stream = writer.GetDocument(); 

      using (var fileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write)) 
      { 
       stream.CopyTo(fileStream); 
      } 

      stream.Dispose(); 
     } 

편집 : 나는 DOCX를 추출 후 은 내가 찾을 수 기본 XML은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?> 
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:body> 
     <w:p> 
      <w:r> 
       <w:t>Hello World!</w:t> 
      </w:r> 
     </w:p> 
    </w:body> 
</w:document> 
+0

.docx 파일을 여는 데 사용하는 사무실 버전은 무엇입니까? – Niladri

+0

@Niladri 사실, 나는 맥없이 사무실을 열지 만 다른 docx 파일을 여는 데는 아무런 문제가 없다. 다른 사람들에게 창문에서 열어 보도록 요청했습니다. 비슷한 문제를 보여줍니다. 그래서 독자의 문제라고 생각하지 않습니다. – daneejela

+0

방금이 작업이 정상적으로 작동하는지 확인했습니다. Win10에서 파일을 작성, 실행 및 생성했습니다. Word2016에서 파일이 열립니다. 지금까지 모든 것이 잘 작동하기 때문에 프로젝트에 대한 자세한 정보를 게시 할 수 있습니까? – Taterhead

답변

2

내 솔루션은 다음과 같습니다.

private MemoryStream _Ms; 
private WordprocessingDocument _Wpd; 

그런 다음 생성 방법은 다음과 같습니다 : 나는 몇 가지 전역 변수가

public Doc() 
{ 
    _Ms = new MemoryStream(); 
    _Wpd = WordprocessingDocument.Create(_Ms, WordprocessingDocumentType.Document, true); 
    _Wpd.AddMainDocumentPart(); 
    _Wpd.MainDocumentPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); 
    _Wpd.MainDocumentPart.Document.Body = new Body(); 
    _Wpd.MainDocumentPart.Document.Save(); 
    _Wpd.Package.Flush(); 
} 

을 그리고 그 방법은 다음과 같습니다 저장 :

public void SaveToFile(string fullFileName) 
{ 
    _Wpd.MainDocumentPart.Document.Save(); 

    _Wpd.Package.Flush(); 

    _Ms.Position = 0; 
    var buf = new byte[_Ms.Length]; 
    _Ms.Read(buf, 0, buf.Length); 

    using (FileStream fs = new System.IO.FileStream(fullFileName, System.IO.FileMode.Create)) 
    { 
     fs.Write(buf, 0, buf.Length); 
    } 
} 

을 그리고 그것을 잘 작동합니다. 이 시도. 다른 사람 가지고이 문제에 대한

+0

고마워,하지만 열려고하면 나에게 똑같은 오류가 발생한다. ( – daneejela

+0

daneejela, 내 대답을 – VDN

+0

에 보내 주길 바란다. 그런 늦은 응답에 대해 유감스럽게 생각한다. 아직까지는 작동하지 않습니다. 크로스 플랫폼 부서에 몇 가지 문제가 있다고 생각합니다. 다른 몇몇 작가들과 함께 이런 행동을 발견했습니다 (예 : onedrive.live.com, http://evidenceprime.github.io/). html-docx-js/test/sample.html 등) 그들은 모두 Mac에서 사용할 수없는 docx 파일을 생성합니다. 내가 Mac에서 열 수있는 좀 이상한 docx 파일은 Windows에서 열 수 없습니다. – daneejela

1

- 그것은 오픈 XML-SDK의 버그가있어, 여기에보고 : https://github.com/OfficeDev/Open-XML-SDK/issues/249

는 _rels에 문제가처럼 /을 가하고, 경로와 숨겨진 파일을 .rels 보이는 Mac에서 문제를 일으키는 추가 백 슬래시.

내 현재 수정/해킹은 기존 빈 문서를 템플릿으로 사용하는 것이 었습니다.