2016-09-09 1 views
-1

J'ai des difficultés à modifier les polices d'un document en utilisant Open XML. J'ai essayé d'utiliser PrependChild pour appliquer la nouvelle police au paragraphe. Cependant, il a lancé l'exception "Impossible d'insérer le fichier OpenXmlElement" newChild "car il fait partie d'un arbre.". Après quelques recherches, j'ai découvert que je dois cloner cet élément dans un objet séparé et apporter des changements, donc je fait cette approcheModifier la police du document en utilisant Open XML

clonedRun = (Run)runList[j].CloneNode(true);      
clonedRun.PrependChild(runProp); 
runList[j] = clonedRun; 

mais ce message d'exception est toujours dehors. J'ai essayé de supprimer l'élément parent de cette course pour ne plus faire partie d'un arbre, cependant, son parent est nul (bien sûr).

static void Main(string[] args) 
{ 
    using (var doc = WordprocessingDocument.Open(@"mydoc.docx", true)) 
    { 
     RunProperties runProp = new RunProperties(); // Create run properties. 
     RunFonts runFont = new RunFonts();   // Create font 
     runFont.Ascii = "Arial";      // Specify font family 
     FontSize size = new FontSize(); 
     size.Val = new StringValue("48"); // 48 half-point font size 
     runProp.Append(runFont); 
     runProp.Append(size); 

     var clonedParagraph = new Paragraph(); 
     var clonedRun = new Run(); 

     var paragraphList = doc.MainDocumentPart.RootElement.Descendants<Paragraph>() 
      .ToList<Paragraph>(); 
     for (int i = 0; i < paragraphList.Count; i++) 
     { 
      clonedParagraph = (Paragraph)paragraphList[i].CloneNode(true); 
      var runList = clonedParagraph.Elements<Run>().ToList(); 

      for (int j = 0; j < runList.ToList().Count; j++) 
      { 
       clonedRun = (Run)runList[j].CloneNode(true);      
       clonedRun.PrependChild(runProp); 
       runList[j] = clonedRun; 
      } 
      paragraphList[i] = clonedParagraph; 
     } 
     doc.MainDocumentPart.Document.Save(); 
    } 
} 

Voici le XML intérieur de clonedNode

<w:r w:rsidRPr="00E474DB" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:rPr> 
     <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:eastAsia="MS Pゴシック" w:cs="Calibri" /> 
     <w:sz w:val="48" /> 
     <w:szCs w:val="48" /> 
     <w:lang w:eastAsia="ja-JP" />  
    </w:rPr> 
    <w:t>Curriculum Vitae</w:t> 
</w:r> 

Répondre

0

Je trouve la question de mon code. Ce que je dois faire est de faire des changements à l'élément RunPropeties, au lieu de Run. Voici mon nouveau code de travail

using (var doc = WordprocessingDocument.Open(@"D:\FSoft_CV - ThangPQ.docx", true)) 
     {    
      Body body = doc.MainDocumentPart.Document.Body; 
      //Get all paragraphs 
      var lstParagrahps = body.Descendants<Paragraph>().ToList(); 
      foreach (var para in lstParagrahps) 
      { 
       var subRuns = para.Descendants<Run>().ToList(); 
       foreach (var run in subRuns) 
       { 
        var subRunProp = run.Descendants<RunProperties>().ToList().FirstOrDefault(); 

        var newFont = new RunFonts(); 
        newFont.Ascii = "Algerian"; 
        newFont.EastAsia = "Algerian"; 

        if (subRunProp != null) 
        { 
         var font = subRunProp.Descendants<RunFonts>().FirstOrDefault(); 
         subRunProp.ReplaceChild<RunFonts>(newFont, font); 
        } 
        else 
        { 
         var tmpSubRunProp = new RunProperties(); 
         tmpSubRunProp.AppendChild<RunFonts>(newFont); 
         run.AppendChild<RunProperties>(tmpSubRunProp); 
        } 

       }   
      } 
      doc.MainDocumentPart.Document.Save(); 
      doc.Close(); 
     }