Замена элементов управления содержимым в OpenXML
Мне нужно что-то в качестве заполнителя. Сначала я рассматривал Content Control как решение, но у меня проблемы с ним.
Затем я рассмотрел добавление CustomXML в .docx, но отвернулся от этого из-за иска i4i.
Тогда я решил, что просто изменил бы текст Content Control через OpenXML SDK 2.0, но даже если бы он так отметил, что Content Control не исчезнет. Я предполагаю, что он не знает, что текст изменился, если это не происходит внутри слова.
Я мог бы просто удалить CC и поместить текст вместо этого, но я боюсь проблем с форматом и стилями, которые он мог бы принести, а также это отчасти помешало бы цели Content Control.
Затем я начал задаваться вопросом, могу ли я определить свои собственные заполнители, которые может распознать Word. Возможно, через строительные блоки. Это не нужно ничего делать, кроме как легко найти с помощью OpenXML и как-то помечать, чтобы я знал, что заменить. Я не совсем уверен, что можно сделать с помощью Building Blocks, но я надеюсь, что это возможно.
Не уверен, какое решение было бы лучше для меня, но то, что мне нужно:
a) Что-то, что легко разместить в шаблоне, возможно, предопределенные заполнители Content Control, которые вы можете разместить там, где вы не хотите и стиль, как вам нравится.
b) Когда данные были добавлены, они удаляют все заполнители, они больше не будут изменены. Он сохраняет стиль/формат, определенные в заполнителе.
В RECAP мне нужен ответ на
Как редактировать элементы управления содержимым в OpenXML SDK, чтобы они удалялись после добавления текста.
-OR -
Могу ли я определить свой собственный тег OpenXML для Word Document, который я мог бы заменить?
Ответы
Ответ 1
Возможно, это может вам помочь,
private void DeleteSdtBlockAndKeepContent(MainDocumentPart mainDocumentPart, string sdtBlockTag)
{
List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList();
SdtBlock sdtA = null;
foreach (SdtBlock sdt in sdtList)
{
if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag)
{
sdtA = sdt;
break;
}
}
OpenXmlElement sdtc = sdtA.GetFirstChild<SdtContentBlock>();
OpenXmlElement parent = sdtA.Parent;
OpenXmlElementList elements = sdtc.ChildElements;
var mySdtc = new SdtContentBlock(sdtc.OuterXml);
foreach (OpenXmlElement elem in elements)
{
string text = parent.FirstChild.InnerText;
parent.Append((OpenXmlElement)elem.Clone());
}
sdtA.Remove();
}
Ответ 2
Взгляните на использование поля. Поля слияния предназначены для этой цели.
Ответ 3
Я не понимаю из вашего вопроса, если вас интересует только решение, которое автоматически удаляет ContentControl/SDT при его изменении с помощью SDK OpenXML или вы хотите, чтобы он исчез после того, как контент был модифицирован программно или пользователя.
Если первый, я думаю, вам придется удалить его самостоятельно как предложил Bilel. Если последнее, вы должны посмотреть на это свойство: ContentControl.Temporary ( "ContentControl автоматически удаляется, когда пользователь вводит элемент управления, или когда текст в элементе управления изменяется программно. Когда ContentControl автоматически удаляется из документа, текст в элементе управления остается в документе." )