2013-05-01 8 views
9

Der Titel gibt den Fehler an, den ich erhalte. Ich versuche verstecken den ganzen Text in einem Word-Dokument mit OpenXml. Wenn ich jetzt versuche, die Absatzeigenschaften anzufügen, erhalte ich den obigen Fehler. Ich kann nicht viel über diesen Fehler online finden.Kann das OpenXmlElement "newChild" nicht einfügen, da es Teil einer Struktur ist

Code, der die Ausnahmefehler

 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

Sie müssen Vanish auch zu 'Run'-Eigenschaften hinzufügen, damit der Effekt funktioniert. – Flowerking

+0

Okay also muss ich jeden Run zuerst verschwinden lassen, dann jeden Absatz verschwinden? oder füge ich die Laufeigenschaften irgendwie an das Paragraph-Objekt an? – user1704863

Antwort

25

Normalerweise verursacht durch Klonieren fixiert werden kann dieser Fehler zurückgibt, was Knoten und dann, dass geklonte Wert eingefügt wird. Etwas wie folgt aus:

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

Dies wird eine Color Instanz erstellen und verwenden Sie dann die gleiche Instanz für alle Grenzen durch die ursprüngliche Instanz Klonen dann Einfügen.

+0

Das war genau das Problem, dem ich gegenüberstand, und das behob es perfekt. Vielen Dank! –

+0

Klonknoten! @amurra: Du bist ein Lebensretter! – slayernoah