Замена элементов управления содержимым в 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 автоматически удаляется из документа, текст в элементе управления остается в документе." )