Замена элементов управления контентом в OpenXML - PullRequest
13 голосов
/ 10 августа 2010

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

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

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

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

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

Не уверен, какое решение будет лучше для меня, но мне нужно:

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

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

ЧТОБЫ ПОВТОРИТЬ, мне нужно ответить либо на

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

-OR-

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

Ответы [ 3 ]

7 голосов
/ 19 августа 2010

Возможно, это может вам помочь,

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();
    }
1 голос
/ 30 декабря 2011

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

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

1 голос
/ 10 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...