2010-08-10 17 views
13

Ho bisogno di qualcosa come segnaposto. All'inizio ho considerato Content Control come una soluzione, ma ho qualche problema con esso.Sostituzione dei controlli del contenuto in OpenXML

Ho quindi esaminato l'aggiunta di CustomXML al .docx ma ho distolto l'attenzione da quello a causa della causa i4i.

Quindi ho deciso di cambiare semplicemente il testo del Controllo contenuto tramite OpenXML SDK 2.0 ma anche se è così marcato il Controllo contenuto non scompare. Immagino che non sappia che il testo è cambiato a meno che non avvenga all'interno della parola.

Forse potrei semplicemente rimuovere il CC e posizionare il testo, ma ho paura dei problemi con il formato e gli stili che potrebbe portare e inoltre sfiderebbe lo scopo del Controllo contenuto.

Poi ho iniziato a chiedermi se potevo definire i miei segnaposto che Word potesse riconoscere. Forse attraverso blocchi di costruzione. Non deve fare nulla se non essere facile da trovare usando OpenXML e in qualche modo taggable quindi so con cosa sostituirlo. Non sono sicuro di cosa si possa fare con Building Blocks, ma spero che sia fattibile.

Non so quale soluzione sarebbe meglio per me, ma quello che mi serve è:

a) Qualcosa che è facile da inserire nel modello, forse predefiniti segnaposto Content Control che è possibile inserire in cui si wan't e stile come desidera.

b) Quando i dati sono stati aggiunti rimuove tutti i segnaposto, non verrà più modificato. Mantiene lo stile/formato definito nel segnaposto.

Per ricapitolare, ho bisogno di risposta a una

Come posso modificare controlli del contenuto in OpenXML SDK in modo che saranno rimossi dopo l'aggiunta di testo.

OPPURE

posso definire il mio tag OpenXML personalizzato per un documento di Word che ho potuto quindi sostituire?

risposta

7

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

Sì, grazie, ho già fatto qualcosa di simile e ho inserito le tabelle all'interno di blocchi per il testo iterato e altri all'interno di sdtRun e li ho sostituiti in base al codice XML dei dati che avevo un percorso da impostare in il tag dei contenuti. –

1

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

+0

Lo controllerò. Mentre l'ho fatto funzionare con stdRun e stdBlock e tale non appare sempre come tale quando viene creato il documento. –

+0

Lo facciamo nel nostro sistema di reporting (Windward) e funziona perfettamente.Verifica la validità del file docx che stai creando da vicino. –

1

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

Se il primo, penso che dovrai rimuoverlo da solo as Bilel suggested. Se quest'ultimo, si dovrebbe guardare questa proprietà: ContentControl.Temporary ("il ContentControl viene automaticamente eliminato quando l'utente digita nel controllo, o quando il testo nel controllo viene modificato a livello di codice.Quando il ContentControl viene automaticamente eliminato dal documento, il testo nel controllo rimane nel documento. ")