2017-04-15 8 views
1

안녕하세요 템플릿의 텍스트를 수학 방정식으로 바꿔야합니다. 나는 단락이나 그의 부분을 바꾸어서 이것을하고 싶다. OpenXML을 사용하여이 작업을 수행하려고합니다. 처음부터 내 프로그램은 템플릿을 열고 새로운 단어 문서로 복사 한 다음 모든 단락의 특정 단어를 찾을 때마다 단락을 새로운 단락으로 바꿀 것입니다. 프로그램을 컴파일하고 작업을 끝내지 만 오류가 나타나기 때문에 새 문서를 열려고하면 열 수 없습니다. 콘텐츠에 문제가 있습니다.OpenXML을 사용하는 MS Word의 텍스트를 수식으로 바꾸십시오.

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