C# 在Word中插入公式(LaTeX/MathML)

Mia張發表於2022-07-06

Word文件是時下非常常用的圖文編輯工具,它的功能不止於編輯文字、圖片。經過數年的版本更新,支援功能及文件元素也愈加豐富。在編輯某些專業性文件時,如試卷、論文、專業期刊等,其中會常要求使用公式功能。Word本身支援插入常見的數學公式,包括簡單公式符號、複雜公式等,本文,將以C#及VB.NET程式碼為例介紹如何來實現在Word中插入公式,編輯公式時,包括使用LaTeX Math Code及MathML Code來展示如何編輯。下面是程式環境及完整的測試程式碼,供參考。

引入dll程式集檔案

  •    通過 NuGet 引入dll(2種方法)的方法

         1.1 可以在Visual Studio中開啟“解決方案資源管理器”,滑鼠右鍵點選“引用”,“管理NuGet包”,然後搜尋“Free Spire.Doc”,點選“安裝”。等待程式安裝完成。

         1.2 將以下內容複製到PM控制檯安裝:

Install-Package FreeSpire.Doc -Version 10.2
  •    手動新增dll引用的方法

可通過手動下載包到本地,然後解壓,找到BIN資料夾下的Spire.Doc.dll。然後在Visual Studio中開啟“解決方案資源管理器”,滑鼠右鍵點選“引用”,“新增引用”,將本地路徑BIN資料夾下的dll檔案新增引用至程式。

插入公式

在編輯公式時,通過 OfficeMath.FromLatexMathCode()方法和 OfficeMath.FromMathMLCode()方法來新增LaTeX公式及MathML公式。開發者可根據程式設計需要選擇其中對應的方法來編輯公式即可。

下面是本次程式程式碼實現公式新增的主要程式碼步驟:

  1.   建立 Document類的物件,並呼叫 Document.AddSection()方法新增節到Word文件。

  2.   通過 Section.AddParagraph()方法新增段落。

  3.   初始化 OfficeMath類的例項。通過 OfficeMath.FromLatexMathCode(string latexMathCode)方法編輯LeTeX公式;通過 OfficeMath.FromMathMLCode(string mathMLCode)方法編輯MathML公式。

  4.   通過 DocumentObjectCollection.Add(Spire.Doc.Interface.IDocumentObject entity)方法新增公式到段落。

  5.   最後,通過 Document.SaveToFile(string fileName, FileFormat fileFormat)方法儲存文件。

C#

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields.OMath;
 
namespace InsertFormula
{
    class Program
    {
        static void Main(string[] args)
        {
            //新建word例項
            Document doc = new Document();
 
            //新增一個section
            Section section = doc.AddSection();
 
            //新增一個段落 
            Paragraph paragraph = section.AddParagraph();
 
            //在第一段新增Latex公式
            OfficeMath officeMath = new OfficeMath(doc);
            officeMath.FromLatexMathCode("x^{2}+\\sqrt{x^{2}+1}=2");
            paragraph.Items.Add(officeMath);
 
            //新增第二個Latex公式到第二段
            Paragraph paragraph2 = section.AddParagraph();
            OfficeMath officeMath1 = new OfficeMath(doc);            
            officeMath1.FromLatexMathCode("\\forall x \\in X, \\quad \\exists y \\leq \\epsilon");
            paragraph2.Items.Add(officeMath1);
 
            //新增Latex符號到第三段 
            Paragraph paragraph3 = section.AddParagraph();
            OfficeMath officeMath2 = new OfficeMath(doc);            
            officeMath2.FromLatexMathCode("\\alpha,\\beta, \\gamma, \\Gamma, \\pi, \\Pi, \\phi, \\varphi, \\mu, \\Phi");
            paragraph3.Items.Add(officeMath2);
 
            //新增MathML公式到第四段
            Paragraph paragraph4 = section.AddParagraph();
            OfficeMath officeMath3 = new OfficeMath(doc);            
            officeMath3.FromMathMLCode("<mml:math xmlns:mml=\"\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msqrt><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:msqrt><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:math>");
            paragraph4.Items.Add(officeMath3);
 
            //儲存文件       
            doc.SaveToFile("InsertFormulas.docx", FileFormat.Docx2013);
            System.Diagnostics.Process.Start("InsertFormulas.docx");
        }
    }
}

vb.net

Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields.OMath
 
Namespace InsertFormula
         Class Program
                   Private Shared Sub Main(args As String())
                            '新建word例項
                            Dim doc As New Document()
 
                            '新增一個section
                            Dim section As Section = doc.AddSection()
 
                            '新增一個段落 
                            Dim paragraph As Paragraph = section.AddParagraph()
 
                            '在第一段新增Latex公式
                            Dim officeMath As New OfficeMath(doc)
                            officeMath.FromLatexMathCode("x^{2}+\sqrt{x^{2}+1}=2")
                            paragraph.Items.Add(officeMath)
 
                            '新增第二個Latex公式到第二段
                            Dim paragraph2 As Paragraph = section.AddParagraph()
                            Dim officeMath1 As New OfficeMath(doc)
                            officeMath1.FromLatexMathCode("\forall x \in X, \quad \exists y \leq \epsilon")
                            paragraph2.Items.Add(officeMath1)
 
                            '新增Latex符號到第三段 
                            Dim paragraph3 As Paragraph = section.AddParagraph()
                            Dim officeMath2 As New OfficeMath(doc)
                            officeMath2.FromLatexMathCode("\alpha,\beta, \gamma, \Gamma, \pi, \Pi, \phi, \varphi, \mu, \Phi")
                            paragraph3.Items.Add(officeMath2)
 
                            '新增MathML公式到第四段
                            Dim paragraph4 As Paragraph = section.AddParagraph()
                            Dim officeMath3 As New OfficeMath(doc)
                            officeMath3.FromMathMLCode("<mml:math xmlns:mml="""" xmlns:m=""http://schemas.openxmlformats.org/officeDocument/2006/math""><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msqrt><mml:msup><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:msqrt><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:math>")
                            paragraph4.Items.Add(officeMath3)
 
                            '儲存文件       
                            doc.SaveToFile("InsertFormulas.docx", FileFormat.Docx2013)
                            System.Diagnostics.Process.Start("InsertFormulas.docx")
                   End Sub
         End Class
End Namespace

注:程式碼中的檔案路徑為程式的debug路徑,檔案路徑可自定義為其他路徑。



—END—



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31499788/viewspace-2904426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章