2017-04-15 76 views
1

您好,我需要將我的模板中的文本替換爲數學公式。我想通過替換一個段落或他的部分來做到這一點。我試圖用OpenXML來做到這一點。開始時我的程序打開一個模板並複製到新的單詞文檔中,然後我在每個段落中查找特定的單詞,當我發現它將用整個公式替換整個段落。程序將編譯並完成工作,但是當我試圖打開一個新文檔時,我不能,因爲出現錯誤:內容出現問題。使用OpenXML將文本替換爲MS Word中的公式

在文件ExampleXML.xml我有什麼樣的XML我想替換:

<?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> 

這是我的代碼:

公共無效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); 
       } 
      } 
     } 
    } 

是什麼錯誤?或者我如何改變文本到等式? 感謝您的幫助。

回答

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(); 
} 
相關問題