2013-05-01 13 views
9

Il titolo indica l'errore che sto ottenendo. Sto provando a nascondi tutto il testo in una parola doc usando OpenXml. Attualmente quando provo ad aggiungere le proprietà del paragrafo, ricevo l'errore sopra riportato. Non riesco a trovare molto su questo errore online.Impossibile inserire OpenXmlElement "newChild" perché fa parte di un albero

codice che restituisce l'errore

 using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(mDoc_copy, true)) 
     { 
      // Manage namespaces to perform XPath queries. 
      NameTable nt = new NameTable(); 
      XmlNamespaceManager nsManager = new XmlNamespaceManager(nt); 
      nsManager.AddNamespace("w", wordmlNamespace); 

      // Get the document part from the package. 
      // Load the XML in the document part into an XmlDocument instance. 
      XmlDocument xdoc = new XmlDocument(nt); 
      xdoc.Load(wdDoc.MainDocumentPart.GetStream()); 

      MainDocumentPart main = wdDoc.MainDocumentPart; 

      IEnumerable<OpenXmlElement> elem = main.Document.Body.Descendants().ToList(); 
      Paragraph p; 
      ParagraphProperties pp = new ParagraphProperties(); 
      ParagraphMarkRunProperties prmp = new ParagraphMarkRunProperties(); 
      Vanish v = new Vanish(); 
      apprmp.AppendChild<Vanish>(v); 
      pp.AppendChild<ParagraphMarkRunProperties>(apprmp); 


      foreach (Paragraph para in main.Document.Body.Descendants<Paragraph>().ToList()) 
      { 


        para.ParagraphProperties = pp; 

      } 
     } 
+0

È inoltre necessario aggiungere Vanish alle proprietà 'Run' per rendere l'effetto funzionante. – Flowerking

+0

Ok, quindi devo prima svuotare ciascuna sequenza, quindi svanire ogni paragrafo? o aggiungo le proprietà di esecuzione all'oggetto Paragrafo in qualche modo? – user1704863

risposta

25

Normalmente questo errore può essere fissato mediante clonazione qualunque nodo sta causando l'eccezione e quindi inserendo tale valore clonato. Qualcosa di simile a questo:

LeftBorder leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }; 
TopBorder topBorder = new TopBorder() { Style = BorderStyleValues.Thin }; 
RightBorder rightBorder = new RightBorder() { Style = BorderStyleValues.Thin }; 
BottomBorder bottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin }; 

Color color = new Color() { Auto = true, Rgb = rgbHexValue == string.Empty ? new HexBinaryValue("00000000") : new HexBinaryValue(rgbHexValue) }; 

leftBorder.Color = color; 
topBorder.Color = (Color)color.CloneNode(true); 
rightBorder.Color = (Color)color.CloneNode(true); 
bottomBorder.Color = (Color)color.CloneNode(true); 

Questo creerà una Color istanza e quindi utilizzare la stessa istanza per tutti i confini clonando l'istanza originale poi inserirla.

+0

Questo era esattamente il problema che stavo affrontando e questo lo ha risolto perfettamente. Grazie! –

+0

CloneNode! @amurra: sei un vero toccasana! – slayernoah

Problemi correlati