Я использую 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 для сравнения документов Word с линейным и профессиональным форматированием, и разница показана ниже. Я думаю, что мне нужен эквивалент метода OMath.BuildUp () в Interop.Word для генерации более сложного 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>