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>
解决方案
推荐阅读
- reactjs - 仅运行一次函数,useEffect 或仅在 Hooks 中调用函数的更好方法是什么?
- json - 执行复杂的 jsonpath 查询
- javascript - 窗口添加的属性返回未定义
- ios - 快速转换数字价格
- salesforce - 我想在 Salesforce 中编写一个可以执行以下任务的公式
- python - 阈值处理后的 imshow(Scikit Image)问题
- delphi - 如何以编程方式在 TBCEditor 中设置文本选择?
- firebase - 我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?
- javascript - React Leaflet:从 MongoDB 获取对象到 Leaflet 映射作为标记(使用 node.js 和 express)
- aem - AEM - 经典 UI - 我们可以在经典 UI 对话 CQ 小部件上实现工具提示吗?如果可能,我们该怎么做?