2017-04-15 28 views
1

こんにちはテンプレートのテキストを数式に置き換える必要があります。私は段落やその部分を置き換えることでこれをやりたい私はOpenXMLでこれをやろうとしています。最初の私のプログラムは、テンプレートを開いて新しい単語の文書にコピーしています。そして、私はすべての段落の特定の単語を探しています。プログラムがコンパイルされ、作業が終了しますが、新しい文書を開くときに、エラーが表示されるため、できません。内容に問題があります。OpenXMLを使用してMS Wordの式にテキストを置き換えます。

ます。public void CreateXmlDocument() {

 var wzor = File.ReadAllText(@"E:\ExampleXML.xml"); 
     using (var template = File.Open(@"E:\ExampleDOCX.docx", FileMode.Open, FileAccess.Read)) 
     { 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       template.CopyTo(stream); 

       using (WordprocessingDocument WordTemplate = WordprocessingDocument.Open(stream, true)) 
       { 

        MainDocumentPart mainDocumentPart = WordTemplate.MainDocumentPart; 

        foreach (var paragraph in mainDocumentPart.Document.Descendants<Paragraph>().ToList()) 
        { 
         var parent = paragraph.Parent; 

         var paragraph_xml = (paragraph.OuterXml); 
         bool containsParam = false; 

         if (paragraph.InnerText.Contains("test")) 
          { 
           var tekst_replace = paragraph_xml; 

           paragraph_xml = paragraph_xml.Replace(tekst_replace, wzor); 
           containsParam = true; 
          } 
         if (containsParam) 
         { 
          parent.InsertBefore(new Paragraph(paragraph_xml), paragraph); 
          paragraph.Remove(); 
         } 
        } 
        mainDocumentPart.Document.Save(); 
        stream.Seek(0, SeekOrigin.Begin); 
       } 

       using (var fileStream = File.Create(@"E:\po.docx")) 
       { 
        stream.CopyTo(fileStream); 
       } 
      } 
     } 
    } 

は何ですか:

<?xml verios="1.0"?> 
<w:p w:rsidRPr="00A750D6" w:rsidR="00212F73" w:rsidP="005437B7" w:rsidRDefault="0027760B" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<m:oMathPara xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"> 
<m:oMath> 
<m:r> 
    <w:rPr> 
     <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
    </w:rPr> 
     <m:t>a=</m:t> 
</m:r> 
<m:f> 
    <m:fPr> 
     <m:ctrlPr> 
      <w:rPr> 
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
       <w:i /> 
      </w:rPr> 
     </m:ctrlPr> 
    </m:fPr> 
    <m:num> 
     <m:r> 
      <w:rPr> 
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
      </w:rPr> 
      <m:t>c</m:t> 
     </m:r> 
    </m:num> 
    <m:den> 
     <m:r> 
      <w:rPr> 
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
      </w:rPr> 
      <m:t>b</m:t> 
     </m:r> 
    </m:den> 
</m:f> 
<m:r> 
    <w:rPr> 
     <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
    </w:rPr> 
    <m:t>*</m:t> 
</m:r> 
<m:rad> 
    <m:radPr> 
     <m:degHide m:val="1" /> 
     <m:ctrlPr> 
      <w:rPr> 
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
       <w:i /> 
      </w:rPr> 
     </m:ctrlPr> 
    </m:radPr> 
    <m:deg /> 
    <m:e> 
     <m:r> 
      <w:rPr> 
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math" /> 
      </w:rPr> 
      <m:t>a</m:t> 
     </m:r> 
    </m:e> 
</m:rad> 
</m:oMath> 
</m:oMathPara> 
<w:bookmarkStart w:name="_GoBack" w:id="0" /> 
<w:bookmarkEnd w:id="0" /></w:p> 

これは私のコードです:ファイルExampleXML.xmlで

私は交換したいものXMLを持っています違う?またはテキストを式に変更するにはどうすればよいですか? ご協力いただきありがとうございます。スニペットから

答えて

0

:それはこのようになります

var wzor = File.ReadAllText(@"E:\ExampleXML.xml"); 

... 

var paragraph_xml = (paragraph.OuterXml); 

... 

var tekst_replace = paragraph_xml; 

paragraph_xml = paragraph_xml.Replace(tekst_replace, wzor); 

はに単純化することができます。

string a = "a"; 
string b_0 = "b"; 
string b_1 = b_0; // b_1 == "b" 

b_0 = b_1.Replace(b_0, a); // "b".Replace("b", "a") 

は、だから直接b_0 = aを設定していない理由は?

またはあなたの場合は、交換してください:

var paragraph_xml = (paragraph.OuterXml); 
bool containsParam = false; 

if (paragraph.InnerText.Contains("test")) 
{ 
    var tekst_replace = paragraph_xml; 

    paragraph_xml = paragraph_xml.Replace(tekst_replace, wzor); 
    containsParam = true; 
} 
if (containsParam) 
{ 
    parent.InsertBefore(new Paragraph(paragraph_xml), paragraph); 
    paragraph.Remove(); 
} 

で:

if (paragraph.InnerText.Contains("test")) 
{ 
    parent.InsertBefore(new Paragraph(wzor), paragraph); 
    paragraph.Remove(); 
} 
関連する問題