Domanda

ho bisogno di qualcosa come segnaposto. Ho guardato in un primo momento al contenuto di controllo come una soluzione, ma sto avendo alcuni problemi con esso.

Poi ho guardato in aggiunta CustomXML al .docx, ma allontanai da che a causa della querela i4i.

Poi ho deciso che solo il cambiamento pianura il testo del Content Control attraverso OpenXML SDK 2.0, ma anche se è così marcata la Content Control non va via. Credo che non sa che il testo modificato a meno che succede parola all'interno.

ho potuto forse solo rimuovere il testo CC e posto invece ma ho paura di problemi con il formato e gli stili che potrebbe portare e anche che sarebbe sorta di sfidare la finalità del controllo dei contenuti.

Poi ho iniziato a chiedermi se potevo definire i miei segnaposti che Word poteva riconoscere. Attraverso forse Building blocks. Non ha a che fare nulla se non essere facile da trovare utilizzando OpenXML e in qualche modo oggetto di tag quindi so cosa sostituirlo con. Io non sono davvero sicuro di quello che può essere fatto con Building Blocks, ma spero che sia fattibile.

Non sei sicuro di quale soluzione sarebbe meglio per me, ma quello che mi serve è:

a) Qualcosa che è facile da posto nel modello, forse predefinito segnaposti Content Control che è possibile inserire in cui si wan't e stile come ti piace.

b) Quando i dati sono stati aggiunti rimuove tutti i segnaposto, non sarà modificato di nuovo. Mantiene lo stile / formato definito nel segnaposto.

Per ricapitolare, ho bisogno di rispondere a uno

Come posso modificare il contenuto Controlli a OpenXML SDK in modo che saranno rimossi dopo l'aggiunta di testo.

-OR -

Posso definire la mia tag OpenXML personalizzato per un documento di Word che ho potuto quindi sostituire?

È stato utile?

Soluzione

Forse questo può aiutare,

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();
    }

Altri suggerimenti

Date un'occhiata a utilizzando un campo. I campi di stampa unione sono stati progettati proprio per questo scopo.

Non capisco dalla tua domanda, se siete interessati solo in una soluzione che rimuove automaticamente il ContentControl / SDT quando si modifica utilizzando l'OpenXML SDK, o se lo si vuole scomparire dopo che il contenuto è modifed di programmazione o un utente.

Nel primo caso, penso che si dovrà rimuovere da soli come Bilel suggerito. In quest'ultimo caso, si dovrebbe guardare in questa struttura: ContentControl.Temporary (" la ContentControl viene cancellato automaticamente quando l'utente digita nel controllo, o quando il testo nel controllo viene modificata a livello di codice. quando il ContentControl viene automaticamente eliminato dal documento, il testo nel controllo rimane nel documento. ")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top