Замена элементов управления содержимым в OpenXML

Мне нужно что-то в качестве заполнителя. Сначала я посмотрел на Content Control как на решение, но у меня с ним возникли проблемы.

Затем я задумался о добавлении CustomXML в .docx, но отказался от этого из-за иска i4i.

Затем я решил просто изменить текст элемента управления контентом с помощью OpenXML SDK 2.0, но даже если он отмечен таким образом, элемент управления контентом не исчезнет. Я предполагаю, что он не знает, что текст изменился, если это не происходит внутри слова.

Я мог бы, возможно, просто удалить CC и разместить текст вместо этого, но я боюсь проблем с форматом и стилями, которые он может принести, а также это как бы бросит вызов цели Content Control.

Затем я начал задаваться вопросом, могу ли я определить свои собственные заполнители, которые может распознать Word. Возможно, через строительные блоки. Он не должен ничего делать, кроме того, что его легко найти с помощью OpenXML и каким-то образом помечать теги, поэтому я знаю, чем его заменить. Я не совсем уверен, что можно сделать с помощью Building Blocks, но я надеюсь, что это выполнимо.

Не уверен, какое решение подойдет мне лучше всего, но мне нужно:

a) Что-то, что легко разместить в шаблоне, возможно, предопределенные заполнители Content Control, которые вы можете разместить там, где хотите, и стилизовать по своему усмотрению.

б) Когда данные были добавлены, они удаляют все заполнители, они больше не будут изменены. Он сохраняет стиль / формат, определенный в заполнителе.

ЧТОБЫ ПОВТОРНО, мне нужен ответ на любой

Как я могу отредактировать элементы управления содержимым в OpenXML SDK, чтобы они удалялись после добавления текста.

-OR-

Могу ли я определить свой собственный тег OpenXML для документа Word, который затем можно было бы заменить?


person Ingó Vals    schedule 10.08.2010    source источник


Ответы (3)


Возможно, это поможет тебе,

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();
    }
person DevTun    schedule 19.08.2010
comment
Да, спасибо, я уже сделал что-то похожее, и я разместил таблицы внутри блоков для повторяющегося текста и прочего внутри sdtRun и заменил их на основе Data XML, который у меня был путь для установки в теге содержимого. - person Ingó Vals; 19.08.2010

Взгляните на использование поля. Поля слияния писем предназначены именно для этой цели.

person David Thielen    schedule 10.06.2011
comment
Я проверю это. Хотя я заставил его работать с stdRun и stdBlock и т. Д., Он не всегда появляется как таковой при создании документа. - person Ingó Vals; 10.06.2011
comment
Мы делаем это в нашей системе отчетов (Windward), и она отлично работает. Внимательно проверьте действительность создаваемого файла docx. - person David Thielen; 17.07.2011

Я не понимаю из вашего вопроса, если вас интересует только решение, которое автоматически удаляет ContentControl / SDT при его изменении с помощью OpenXML SDK, или вы хотите, чтобы он исчез после программного изменения содержимого или пользователем.

Если первое, я думаю, вам придется удалить его самостоятельно, как предложил Билель. В последнем случае вам следует обратить внимание на это свойство: ContentControl.Temporary (" ContentControl автоматически удаляется, когда пользователь вводит элемент управления или когда текст в элементе управления изменяется программно. Когда ContentControl автоматически удаляется из документа, текст в контроль остается в документе. ")

person Carl G    schedule 30.12.2011