将方程式添加到OpenXML Wordprocessing文档并以Professional格式显示

时间:2019-01-13 22:08:07

标签: c# openxml

我正在使用OpenXML创建文字处理文档并添加方程式。我可以添加方程式,当我在MS Word中打开时,这些方程式可以正确显示在文档中,但是它们以线性格式而不是专业格式显示。在Word中将显示更改为“专业”非常简单,但是我宁愿从一开始就正确显示方程式。是否可以通过Open XML以编程方式控制它?我的测试代码如下。

using System;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sourceFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\test\equationTemplate.dotx";
            string destinationFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\test3.docx";
            // Create a copy of the template file and open the copy
            File.Copy(sourceFile, destinationFile, true);
            using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true))
            {
                document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
                MainDocumentPart mainPart = document.MainDocumentPart;
                DocumentSettingsPart documentSettingPart1 = mainPart.DocumentSettingsPart;
                AttachedTemplate attachedTemplate1 = new AttachedTemplate() { Id = "relationId1" };
                documentSettingPart1.Settings.Append(attachedTemplate1);
                documentSettingPart1.AddExternalRelationship("http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate", new Uri(sourceFile, UriKind.Absolute), "relationId1");
                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());
                Paragraph para = body.AppendChild(new Paragraph());
                var para2 = para.AppendChild(new DocumentFormat.OpenXml.Math.Paragraph());
                DocumentFormat.OpenXml.Math.OfficeMath myMath = new DocumentFormat.OpenXml.Math.OfficeMath(new Run(new Text(@"M=\frac{wl^2}{8}")));
                para2.AppendChild(myMath);
                mainPart.Document.Save();
            }
        }
    }
}

我已经使用OpenXML Productivity Tool比较了线性和专业格式的Word文档,差异如下所示。我想我需要等效于Interop.Word中的OMath.BuildUp()方法来生成更复杂的XML,但是我在OpenXML的任何地方都找不到。

 <m:oMathPara>
        <m:oMath>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           M=\frac{wl^2}{8}
          </m:t>
         </m:r>
        </m:oMath>
       </m:oMathPara>


   <m:oMathPara>
    <m:oMath>
     <m:r>
      <w:rPr>
       <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
      </w:rPr>
      <m:t>
       M=
      </m:t>
     </m:r>
     <m:f>
      <m:fPr>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
        </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>
         w
        </m:t>
       </m:r>
       <m:sSup>
        <m:sSupPr>
         <m:ctrlPr>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
           <w:i/>
          </w:rPr>
         </m:ctrlPr>
        </m:sSupPr>
        <m:e>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           l
          </m:t>
         </m:r>
        </m:e>
        <m:sup>
         <m:r>
          <w:rPr>
           <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
          </w:rPr>
          <m:t>
           2
          </m:t>
         </m:r>
        </m:sup>
       </m:sSup>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
         <w:i/>
        </w:rPr>
       </m:ctrlPr>
      </m:num>
      <m:den>
       <m:r>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
        </w:rPr>
        <m:t>
         8
        </m:t>
       </m:r>
       <m:ctrlPr>
        <w:rPr>
         <w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/>
         <w:i/>
        </w:rPr>
       </m:ctrlPr>
      </m:den>
     </m:f>
    </m:oMath>
   </m:oMathPara>

0 个答案:

没有答案