2016-09-09 25 views
-1

Open XMLを使用して文書のフォントを変更するのに問題があります。 PrependChildを使って新しいフォントを段落に適用しようとしました。ただし、 "OpenXmlElement" newChild "はツリーの一部であるため挿入できません"という例外が投げられました。 "いくつかの研究の後、私は別々のオブジェクトにその要素のクローンを作成し、そこに変更を加える必要があることが分かったので、私はOpen XMLを使用して文書のフォントを変更する

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

このアプローチをしたが、その例外のメッセージはまだ出てきます。その実行の親要素を削除してツリーの一部にしないようにしましたが、その親はnullです(もちろん)。

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

は、ここで私は私のコードの問題を発見した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> 

答えて

0

の内側のXMLです。私がする必要があるのはRunの代わりにRunPropeties要素に変更を加えることです。以下は私の新しい作業コードです

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(); 
     } 
関連する問題