Zastępowanie kontrolek zawartości w OpenXML

Potrzebuję czegoś zastępczego. Na początku patrzyłem na kontrolę treści jako rozwiązanie, ale mam z tym pewne problemy.

I wtedy spojrzał na dodanie CustomXML do .docx, ale odwrócił się od tego z powodu pozwu i4i.

Potem zdecydowałem, że po prostu zmienię tekst kontroli zawartości za pomocą OPENXML SDK 2.0, ale nawet jeśli jest tak oznaczony, kontrola zawartości nie znika. Domyślam się, że nie wie, że tekst się zmienił, chyba że dzieje się to wewnątrz słowo.

Mógłbym po prostu usunąć CC i zamiast tego umieścić tekst, ale obawiam się problemów z formatem i stylami, które mogłyby przynieść, a także byłoby to sprzeczne z celem kontroli treści.

Potem zacząłem się zastanawiać, Czy Mogę zdefiniować własne symbole zastępcze, które słowo może rozpoznać. Może przez klocki. Nie musi nic robić poza tym, że łatwo go znaleźć używając OpenXML i jakoś taggable, więc wiem, czym go zastąpić. Nie jestem pewien, co może być skończyłem z klockami, ale mam nadzieję, że da radę.

Nie wiem, jakie rozwiązanie byłoby dla mnie najlepsze, ale potrzebuję:

A) coś, co jest łatwe do umieszczenia w szablonie, być może predefiniowane elementy zastępcze kontroli zawartości, które możesz umieścić tam, gdzie nie chcesz i stylować jak chcesz.

B) Po dodaniu danych usuwa wszystkie symbole zastępcze, nie będą one ponownie modyfikowane. Zachowuje styl / format zdefiniowany w elemencie zastępczym.

Podsumowując, potrzebuję odpowiedzi na albo

Jak mogę edytować kontrolki zawartości w OPENXML SDK, aby zostały usunięte po dodaniu tekstu.

-LUB -

Czy Mogę zdefiniować własny niestandardowy znacznik OpenXML dla dokumentu Word, który mogę następnie zastąpić?

Author: Askolein, 2010-08-10

3 answers

Być może to ci pomoże,

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
Author: DevTun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-19 08:39:56

Spójrz na użycie pola. Pola Mail merge są przeznaczone właśnie do tego celu.

 1
Author: David Thielen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-10 01:41:11

Nie rozumiem z twojego pytania, czy interesuje Cię tylko rozwiązanie, które automatycznie usuwa ContentControl/SDT po modyfikacji za pomocą OPENXML SDK, czy też chcesz, aby zniknęło po modyfikacji zawartości programowo lub przez użytkownika.

Jeśli ten pierwszy, myślę, że będziesz musiał usunąć go samodzielnie , Jak zasugerował Bilel . Jeśli to ostatnie, należy spojrzeć na tę właściwość: ContentControl.Temporary ("ContentControl jest automatycznie usunięte, gdy użytkownik wpisuje w kontrolce lub gdy tekst w kontrolce jest zmieniany programowo. Gdy kontrolka ContentControl zostanie automatycznie usunięta z dokumentu, tekst w kontrolce pozostanie w dokumencie.")

 1
Author: Carl G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:59:56