zoukankan      html  css  js  c++  java
  • 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
            }
        }
    
    
    
      
    }
    

      

    效果图

    相应的源码:https://files.cnblogs.com/weu135/OMath%E7%A4%BA%E4%BE%8B%E7%89%88.rar

  • 相关阅读:
    Spring AOP 实现原理
    Spring Aop实现方式总结
    Spring Aop重要概念介绍及应用实例结合分析
    Spring Aop
    常见的排序算法
    MINA2.0原理
    Java和Tomcat类加载机制
    Java 8 新特性概述
    Java类加载机制深度分析
    jetty之建立多Connector
  • 原文地址:https://www.cnblogs.com/weu135/p/2933997.html
Copyright © 2011-2022 走看看