首页 > 解决方案 > 将公式添加到 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>

标签: c#openxml

解决方案


推荐阅读