c# - OpenXML 将文本插入内容控件 Word 2007

标签 c# ms-word openxml

我正在学习 OpenXML。我花了好几个小时试图找到如何完成一项简单的任务:将文本插入到 C# 中的内容控件中。

我有一个包含两个控件“姓名”和“年龄”的模板文档。我可以很好地找到它们,但我就是无法在其中添加文本。我尝试了很多方法,但都无济于事。

        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);
            }
        }

非常感谢所有帮助。

干杯,

蒂姆。

编辑——

感谢您的回复。听取您的建议,我尝试使用生产力工具进行转换和深入研究,以找到要更新的子元素。您能告诉我您是否明白为什么这段代码没有向文档写入任何内容吗?

        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;
                        }
                    }     
                }

最佳答案

您需要将 SdtElement 强制转换为任何内容,以便获取其内容子元素。

例如,如果它是一个 SdtBlock:

    ((SdtBlock)sdt).SdtContentBlock

然后你可以添加东西(例如添加 child )。

From 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

关于c# - OpenXML 将文本插入内容控件 Word 2007,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810014/

相关文章:

c# - 无法对 PrintDialog 中止使用react

c# - 您如何将 allow-stretch 应用于所有 sitecore 媒体 img 标签?

c# - LINQ 两个 Where 子句

c# - Wpf:MediaElement 暂停并再次播放禁用速度比

arrays - 使用 VBA,将 Word 中的数组打印到 Excel

vba - 查找包含直撇号(相对于卷撇号)的单词

vb.net - 如何使用 Open XML 将公式插入 Excel 2010 工作表?

vba - 使用 Microsoft Word 宏插入调整大小和重新定位图像

colors - <color indexed ="81"> 是什么意思?

c# - OpenXML - 获取图像替代文本标题