OpenXML将文本插入到内容控件Word 2007中

Han*_*han 3 c# ms-word openxml

我正在学习OpenXML.我一直在寻找几个小时试图找到如何做一个简单的任务:在c#中的内容控件中插入文本.

我有一个模板文档,其中包含两个控件"Name"和"Age".我可以很好地找到它们,但我无法在其中添加文本.我尝试过很多东西,都无济于事.

        byte[] templateBytes = System.IO.File.ReadAllBytes(fileName);
        using (MemoryStream templateStream = new MemoryStream())
        {
            templateStream.Write(templateBytes, 0, (int)templateBytes.Length);

            using (WordprocessingDocument outDoc = WordprocessingDocument.Open(templateStream, true))
            {
                MainDocumentPart mainPart = outDoc.MainDocumentPart;

                foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>().ToList())
                {
                    SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();

                    if (alias != null)
                    {
                        string sdtTitle = alias.Val.Value;

                        switch (sdtTitle)
                        {
                            case "Name":
                                // ¿Qué?
                                break;
                            case "Age":
                                // ¿Qué?
                                break;
                        }
                    }
                }

                outDoc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
            }

            using (FileStream fileStream = new FileStream(savePath, System.IO.FileMode.CreateNew))
            {
                templateStream.WriteTo(fileStream);
            }
        }
Run Code Online (Sandbox Code Playgroud)

所有帮助非常感谢.

干杯,

蒂姆.

编辑 -

谢谢你的回复.根据您的建议,我尝试使用生产力工具进行投射和挖掘,以找到要更新的子元素.你能否告诉我你是否可以看到为什么这段代码根本没有在文档中写任何内容?

        foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>().ToList())
                {
                    SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();

                    if (alias != null)
                    {
                        SdtRun xRun = (SdtRun)sdt;
                        SdtContentRun xContentRun = xRun.Descendants<SdtContentRun>().FirstOrDefault();
                        Run xRun = xContentRun.Descendants<Run>().FirstOrDefault();
                        Text xText = xRun.Descendants<Text>().FirstOrDefault();

                        string sdtTitle = alias.Val.Value;

                        switch (sdtTitle)
                        {
                            case "Name":
                                xText.Text = "Whatever";                  
                                break;
                            case "Age":                    
                                xText.Text = "69";
                                break;
                        }
                    }     
                }
Run Code Online (Sandbox Code Playgroud)

Jas*_*ext 6

您需要将SdtElement转换为它的任何内容,以便获取其内容子项.

例如,如果它是一个SdtBlock:

    ((SdtBlock)sdt).SdtContentBlock
Run Code Online (Sandbox Code Playgroud)

然后你可以添加东西(例如添加孩子).

从MSDN,继承层次结构:

 DocumentFormat.OpenXml.Wordprocessing.SdtElement
     DocumentFormat.OpenXml.Wordprocessing.SdtBlock
     DocumentFormat.OpenXml.Wordprocessing.SdtCell
     DocumentFormat.OpenXml.Wordprocessing.SdtRow
     DocumentFormat.OpenXml.Wordprocessing.SdtRun
     DocumentFormat.OpenXml.Wordprocessing.SdtRunRuby
Run Code Online (Sandbox Code Playgroud)