Open Xml Sdk創建公式


距離上一篇openxml的文章已經過去很久了,這段時間一直忙於openxml來自動生成word。把自動生成word的心得寫出來,這一篇就寫插入word2007數學公式吧。

       在寫插入數學公式之前先回顧一下openxml的相關知識,openxml是基於xml和zip協議的文檔描述格式。所以我們可以將word的中一個個組成看成一個個標簽對,自動生成word的內容就是在生成一個個標簽對,然后插入內容,插入到文檔標簽中。使用openxml生成word速度比微軟自帶的接口速度快了十幾倍,不過稍顯不足的是word2003不是openxml格式的。

       Paragraph是openxml中的段落標簽,這個標簽是word的基本組成部分,word中除了表格標簽外,其他的內容都是放在Paragraph中的。

OfficeMath即數學公式標簽。

下面是示例代碼,這里先只寫一個簡單的公式,有空我在把常用的公式整理出來

代碼

公式類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using W = DocumentFormat.OpenXml.Wordprocessing;
using M = DocumentFormat.OpenXml.Math;
using DocumentFormat.OpenXml;

namespace OMath
{
    /// <summary>
    /// 生成公式的類
    /// 這段代碼是使用word2007插入新公式后,使用Open XML SDK 2.0 Productivity Tool反編譯出c#代碼寫出來的
    /// </summary>
    class MathHelper
    {
        #region 常用變量
        public static string fontName = "微軟雅黑";
        //四號字,對應word中的大小是10.5(Ps:這是openxml的一個不好之處就是,單位和word中顯示的不一致)
        public static string fontSize = "21";

        public static string fontSizeComplexScript = "24";
        #endregion

        #region 插入文檔的公式
        public static M.OfficeMath GetSubScript(string baseString, string downString)
        {
            M.OfficeMath officeMath = new M.OfficeMath();
            M.Subscript subScript = GenerateSubscript(baseString, downString);
            officeMath.Append(subScript);
            return officeMath;
        }

        public static M.OfficeMath GetSubScript(string baseString, string downString, string runText)
        {
            M.OfficeMath officeMath = new M.OfficeMath();
            M.Subscript subScript = GenerateSubscript(baseString, downString);
            M.Run run = GenerateMathRun(runText);
            officeMath.Append(subScript);
            officeMath.Append(run);
            return officeMath;
        }
        #endregion


        #region 基礎公式
        /// <summary>
        /// 帶有下標的公式
        /// </summary>
        /// <param name="baseString">基礎字符</param>
        /// <param name="downString">下標字符</param>
        /// <returns></returns>
        public static M.Subscript GenerateSubscript(string baseString, string downString)
        {
            M.Subscript subscript1 = new M.Subscript();

            M.Base base1 = new M.Base();

            M.Run run1 = GenerateMathRun(baseString);

            base1.Append(run1);

            M.SubArgument subArgument = new M.SubArgument();

            M.Run run = GenerateMathRun(downString);

            subArgument.Append(run);
            subscript1.Append(base1);
            subscript1.Append(subArgument);
            return subscript1;
        }

        /// <summary>
        /// 帶有下標的公式
        /// </summary>
        /// <param name="baseElement">基礎元素</param>
        /// <param name="downElement">下標元素</param>
        /// <returns></returns>
        public static M.Subscript GenerateSubscript(OpenXmlElement baseElement, OpenXmlElement downElement)
        {
            M.Subscript subscript1 = new M.Subscript();

            M.Base base1 = new M.Base();

            base1.Append(baseElement);

            M.SubArgument subArgument = new M.SubArgument();

            subArgument.Append(downElement);
            subscript1.Append(base1);
            subscript1.Append(subArgument);
            return subscript1;
        }



        /// <summary>
        /// 帶有上標的公式
        /// </summary>
        /// <param name="baseString">基礎字符</param>
        /// <param name="upString">上標字符</param>
        /// <returns></returns>
        public static M.Superscript GenerateSuperscript(string baseString, string upString)
        {
            M.Superscript superscript = new M.Superscript();

            M.Base base1 = new M.Base();

            M.Run run1 = GenerateMathRun(baseString);

            base1.Append(run1);

            M.SuperArgument superArgument = new M.SuperArgument();

            M.Run run = GenerateMathRun(upString);

            superArgument.Append(run);
            superscript.Append(base1);
            superscript.Append(superArgument);
            return superscript;
        }

        /// <summary>
        /// 帶有上標的公式
        /// </summary>
        /// <param name="baseElement">基礎元素</param>
        /// <param name="upElement">上標元素</param>
        /// <returns></returns>
        public static M.Superscript GenerateSuperscript(OpenXmlElement baseElement, OpenXmlElement upElement)
        {
            M.Superscript superscript = new M.Superscript();

            M.Base base1 = new M.Base();

            base1.Append(baseElement);

            M.SubArgument subArgument = new M.SubArgument();

            subArgument.Append(upElement);
            superscript.Append(base1);
            superscript.Append(subArgument);
            return superscript;
        }

        #endregion


        #region run,是存放最基礎的文本信息的標簽
        private static M.Run GenerateMathRun(string baseString)
        {
            M.Run run1 = new M.Run();
            W.RunProperties runProperties = new W.RunProperties();

            //字體
            W.RunFonts runFonts1 = new W.RunFonts() { Ascii = fontName, HighAnsi = fontName, EastAsia = fontName };
            //字的大小
            W.FontSize fontSize1 = new W.FontSize() { Val = fontSize };

            W.FontSizeComplexScript fsc = new W.FontSizeComplexScript { Val = fontSizeComplexScript };
            run1.Append(new W.RunProperties(runFonts1, fontSize1, fsc));

            run1.Append(new W.Text() { Text = baseString });
            return run1;
        }
        #endregion
    }
}

  word處理類:

using W = DocumentFormat.OpenXml.Wordprocessing;
using M = DocumentFormat.OpenXml.Math;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml.Packaging;
using System.IO;
using DocumentFormat.OpenXml;

namespace OMath
{
    public class OpenWord
    {
        public WordprocessingDocument wDoc;
        public MainDocumentPart mainDoc;
        public W.Body body;
        public W.Document doc;

        public static string fontName = "微軟雅黑";
        //四號字,對應word中的大小是10.5(Ps:這是openxml的一個不好之處就是,單位和word中顯示的不一致)
        public static string fontSize = "21";
        /// <summary>
        /// 初始化文檔
        /// </summary>
        /// <param name="fileName">創建文檔的路徑名稱</param>
        public void Init(string fileName)
        {
            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }
            wDoc = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document);
            mainDoc = wDoc.AddMainDocumentPart();
            doc = new W.Document();
            body = new W.Body();
        }


        public void AddMath(M.OfficeMath oMath)
        {
            W.Paragraph paragraph = new W.Paragraph();

            //修飾段落的屬性,
            W.ParagraphProperties paragraphProperties1 = new W.ParagraphProperties();
            //修飾段落中一些
            W.ParagraphMarkRunProperties paragraphMarkRunProperties = new W.ParagraphMarkRunProperties();

            //字體
            W.RunFonts runFonts1 = new W.RunFonts() { Ascii = fontName, HighAnsi = fontName, EastAsia = fontName };
            //字的大小
            W.FontSize fontSize1 = new W.FontSize() { Val = fontSize };

            paragraphMarkRunProperties.Append(runFonts1);
            paragraphMarkRunProperties.Append(fontSize1);


            //段落格式,這里設置段落居中(ps:在很多很多的word中或者是書籍中,公式一般都是居中滴)
            W.Justification justification = new W.Justification() { Val = W.JustificationValues.Center };
            paragraphProperties1.Append(paragraphMarkRunProperties);
            paragraphProperties1.Append(justification);
            paragraph.Append(paragraphProperties1);
            //添加公式
            paragraph.Append(oMath);
            //將短路添加入文檔
            body.Append(paragraph);
        }


        public void save()
        {
            doc.Body = body;
            mainDoc.Document = doc;
            wDoc.Close();
        }

    }
}

  測試類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace OMath
{
  

    class Program
    {

        static void Main(string[] args)
        {
            string FileName = "D:\\testMath.docx";
            #region 創建word文檔
            OpenWord ow = new OpenWord();
            ow.Init(FileName);
            ow.AddMath(MathHelper.GetSubScript("X","i"));
            ow.AddMath(MathHelper.GetSubScript("X", "i","=y+2"));
            ow.save();

            #endregion
        }
    }



  
}

  

效果圖

 

相應的源碼:http://files.cnblogs.com/weu135/OMath%E7%A4%BA%E4%BE%8B%E7%89%88.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM