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

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

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

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

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

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

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

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

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

Чтобы ЗАПИСАТЬ, мне нужно ответить либо на

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

-OR-

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

13
задан Cindy Meister 21 December 2018 в 19:36
поделиться

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();
    }
7
ответ дан 2 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: