代码之家  ›  专栏  ›  技术社区  ›  Glory Raj

尝试从dot net core mvc下载使用openxml的word文档时出错

  •  0
  • Glory Raj  · 技术社区  · 6 年前

    我试图在dotnetcore中使用openxml插件生成word文档,方法是在控制器内部的action result方法中编写代码,如下所示

        public IActionResult CreateDocument()
        {
            using (MemoryStream mem = new MemoryStream())
            {
                using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(mem, WordprocessingDocumentType.Document, true))
                {
                    wordDoc.AddMainDocumentPart();
                    Document doc = new Document();
    
                    //Body body = new Body();
    
                    /// Add header
                    MainDocumentPart mainDocPart = wordDoc.MainDocumentPart;
    
                    HeaderPart headerPart1 = mainDocPart.AddNewPart<HeaderPart>("r97");
    
                    Header header1 = new Header();
    
                    Paragraph paragraph1 = new Paragraph() { };
                    Run run1 = new Run();
                    Text text1 = new Text();
                    text1.Text = "This is Header Part";
    
                    run1.Append(text1);
                    paragraph1.Append(run1);
                    header1.Append(paragraph1);
    
                    headerPart1.Header = header1;
    
                    // getting an error here in this line
                    SectionProperties sectionProperties1 = mainDocPart.Document.Body.Descendants<SectionProperties>().FirstOrDefault();  
                    if (sectionProperties1 == null)
                    {
                        sectionProperties1 = new SectionProperties() { };
                        mainDocPart.Document.Body.Append(sectionProperties1);
                    }
                    HeaderReference headerReference1 = new HeaderReference() { Type = HeaderFooterValues.Default, Id = "r97" };
                    sectionProperties1.InsertAt(headerReference1, 0);
                 .......
                ........
                .........
               }
            }
         }
    

    SectionProperties sectionProperties1 = mainDocPart.Document.Body.Descendants<SectionProperties>().FirstOrDefault();

    **Error:** DocumentFormat.OpenXml.Packaging.MainDocumentPart.Document.get returned null.

    我不知道我在哪里做错了这个代码,请任何人提出任何关于这个的想法

    非常感谢

    0 回复  |  直到 6 年前
        1
  •  1
  •   Lutti Coelho    6 年前

    您可以实例化 mainDocPart 此行变量:
    MainDocumentPart mainDocPart = wordDoc.MainDocumentPart;

    那么您没有在其中添加任何文档。这就是为什么你会出错: DocumentFormat.OpenXml.Packaging.MainDocumentPart.Document.get returned null.

    mainDocPart.Document = doc; //you define earlier but do not used.
    doc.Body = new Body();
    SectionProperties sectionProperties1 = 
    mainDocPart.Document.Body.Descendants<SectionProperties>()?.FirstOrDefault();  
    if (sectionProperties1 == null)
    {
        sectionProperties1 = new SectionProperties() { };
        mainDocPart.Document.Body.Append(sectionProperties1);
    }
    

    您可以在本文档页面获得更多信息: https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.document?redirectedfrom=MSDN&view=openxml-2.8.1

        2
  •  1
  •   Thomas Barnekow    6 年前

    WordprocessingDocument 由一个 MainDocumentPart

    <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:body />
    </w:document>
    

    因此,在创建“空”文档时,至少应具有以下代码:

    using (var stream = new MemoryStream())
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(stream, WordprocessingDocumentType.Document))
    {
        MainDocumentPart mainDocumentPart = wordDocument.AddMainDocumentPart();
        mainDocumentPart.Document = new Document(new Body());
    }
    

    请注意 w:document 和 w:body 元素与 Document Body

    以创建标头为例,通常可以通过组合构造函数来简化代码,从而创建类似XML标记的结构,如下所示:

    var headerPart = mainDocumentPart.AddNewPart<HeaderPart>();
    headerPart.Header =
        new Header(
            new Paragraph(
                new Run(
                    new Text("This is the Header Part"))));
    

    在上面的代码示例中,我将代码布局为您将格式化相应的开放XML标记:

    <w:hdr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:p>
        <w:r>
          <w:t>This is the Header Part</w:t>
        </w:r>
      </w:p>
    </w:hdr>
    

    在我看来,这更容易阅读,而且如果您了解创建所需结果所需的开放XML标记,就有助于避免错误。