我正在尝试使用Open Xml SDK在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();
PS:我是一种更通用的方式,是否有任何资源可以解释Word ML元素的用途和层次结构?
答案 0 :(得分:1)
您的代码接近于将模仿副本粘贴到内容控件中。以下两行是删除内容控件中所有段落的行:
var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First();
contentControlParagraph.RemoveAllChildren();
相反,您需要确定要放置段落的位置,并Append
将其放在那里。
例如,我有一个带有名为CopyPasteCC的富文本内容控件的docx。此图像以开发人员模式显示doc。内容控件有3个现有段落。
然后,我用以下代码替换你的代码:
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();
第三行选择第二行中找到的内容控件中的所有段落。然后它在第二个现有段落之后插入一个新段落。运行此代码后,以下图片是上述文件:
要回答您的 PS 问题,您可以尝试阅读正式的OpenXML Specification。这不容易阅读,但它是权威的规范。有一个更通用(但过时)的免费电子书名为OpenXml Explained。
我每个月都会参考一次这些信息。 OpenXml Explained的第一章涵盖WordprocessingML
,第39页有一个结构化文档标签部分,其中概述了内容控件。