Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms word 在Word内容控件中使用富文本插入某些段落的正确方法是什么?_Ms Word_Openxml Sdk - Fatal编程技术网

Ms word 在Word内容控件中使用富文本插入某些段落的正确方法是什么?

Ms word 在Word内容控件中使用富文本插入某些段落的正确方法是什么?,ms-word,openxml-sdk,Ms Word,Openxml Sdk,我试图使用OpenXMLSDK在Word内容控件中插入一些段落 我的代码似乎有效(在word文件中可以看到段落)。但是,无法编辑控件。我只能在插入新内容之前删除整个内容 如何模拟手动复制/粘贴到内容控件中 仅供参考,以下是我的代码: var mainPart = package.MainDocumentPart; var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProp

我试图使用OpenXMLSDK在Word内容控件中插入一些段落

我的代码似乎有效(在word文件中可以看到段落)。但是,无法编辑控件。我只能在插入新内容之前删除整个内容

如何模拟手动复制/粘贴到内容控件中

仅供参考,以下是我的代码:

var mainPart = package.MainDocumentPart;

var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "TagOfMyContentControl");

foreach (var sdtBlock in sdtRuns)
{
    List<Paragraphs> paragraphs = GetParapraphsFromSomewhere();
    var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First();
    contentControlParagraph.RemoveAllChildren();
    contentControlParagraph.Append(paragraphs);
}

mainPart.Document.Save();
var mainPart=package.MainDocumentPart;
var sdtRuns=mainPart.Document.subjects().Where(run=>run.SdtProperties.GetFirstChild().Val.Value==“TagOfMyContentControl”);
foreach(sdtRuns中的变量sdtBlock)
{
列出段落=GetParapraphsFromsomeone();
var contentcontrolparagration=sdtBlock.subjects().First();
ContentControl段落.RemoveAllChildren();
内容控制段落。附加(段落);
}
mainPart.Document.Save();

PS:I更一般地说,是否有任何资源可以解释Word ML元素的用途和层次结构?

您的代码几乎可以模拟复制粘贴到内容控件中。以下两行是删除内容控件中所有段落的行:

var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First();
contentControlParagraph.RemoveAllChildren();
第三行选择第二行内容控件内的所有段落。然后在现有的第二段之后插入一个新段。下图是运行此代码后的上述文件:

要回答你的PS问题,你可以尝试阅读一些正式的内容。这不容易阅读,但它是权威的规范。有一本更通用(但过时)的免费电子书,书名为

我每个月参考一次这些信息。OpenXml的第一章介绍了
WordprocessingML
,第39页有一节介绍了结构化文档标记,其中概述了内容控件

        var mainPart = document.MainDocumentPart;

        var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "CopyPasteCC");

        sdtRuns.ElementAt(0).Descendants<Paragraph>().ElementAt(1).InsertAfterSelf(
            new Paragraph(new Run(new Text("Hello - this is new Copy Paste paragraph")))
            );

        mainPart.Document.Save();