一键批量将mathtype公式转换成word自带公式-vba/vbnet

文章目录

  • 实现效果
  • 一、mathtype与word自带公式omaths
    • 1.mathtype在word中的表现形式
    • 2.实现原理
    • 3.为什么要将mathtype转换成word自带公式?
  • 二、代码实现方式
    • 1.word自带vba实现
    • 2.vbnet实现
  • 总结
  • 博主已封装好的vba/工程附件
  • TIPS:商用软件推荐


❤️转载请标注转载引用谢谢!

实现效果

一键批量将word内mathtype公式转换成word自带公式!


一、mathtype与word自带公式omaths

1.mathtype在word中的表现形式

mathtype在word是以 inlineshape 形状类型插入到word中的,如果运行下面vba代码,所有的mathtype将被删除.但inlineshape查找却识别不出查找的对象是图片还是mathtype公式!


Sub test1()
    
    Dim a As InlineShape
    For Each a In Word.ActiveDocument.InlineShapes
        a.Delete
    Next
End Sub

而解析时候,目前本章方法可操作的,是将mathtype先转换成MathML2.0(namespaceattr)格式:
一键批量将mathtype公式转换成word自带公式-vba/vbnet_第1张图片
公式转换后如下:
在这里插入图片描述

<math xmlns='http://www.w3.org/1998/Math/MathML'>
 <mrow>
  <msqrt>
   <mrow>
    <msup>
     <mi>a</mi>
     <mn>2</mn>
    </msup>
    <mo>+</mo><msup>
     <mi>b</mi>
     <mn>2</mn>
    </msup>
    </mrow>
  </msqrt>
  </mrow>
</math>

2.实现原理

word会自动将mathtype转换后的代码识别成公式,当Ctrl C复制这串代码后,Ctrl V黏贴进word时,会提供选择生成公式的类型,见下图:
一键批量将mathtype公式转换成word自带公式-vba/vbnet_第2张图片
omml公式即word自带的omaths公式,在已经安装了公式编辑器的前提下,你也可以直接复制上面的转换后代码到word中尝试一下!
【注意】如果之前已经点击了“记住我的选择”,则后续黏贴会记住选择直接黏贴!

所以:
【实现方式】
①先利用公式编辑器全文转换mathtype成MathML2.0(namespaceattr)格式
②利用word vba中的selection.find方法逐个复制copy转换后的公式,替换黏贴成无格式文本即可直接转换成omaths公式!

3.为什么要将mathtype转换成word自带公式?

目前大部分网页web应用或者程序运行对于公式的处理基本上是以LaTeX公式为主,omaths为辅,而公式编辑器商用识别费用不菲,所以能自己单独转换可以省一部分不少的功能开销!

二、代码实现方式

1.word自带vba实现

代码如下(示例):


Sub 公式转换()
    'On Error Resume Next
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
    
    Selection.Find.ClearFormatting
    
    With Selection.Find
        .Text = "\"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    
    Selection.HomeKey wdStory
    While Selection.Find.Execute
        Selection.Copy
        
        Dim t, i As Single
        t = Timer
        Do
            i = i + 1
        Loop While Timer - t < 0.05
        Selection.PasteAndFormat (WdRecoveryType.wdFormatPlainText)
    Wend
End Sub



2.vbnet实现

代码如下(示例):

Imports Microsoft.Office.Interop.Word
Module Module1
    Sub 公式转换(app As Microsoft.Office.Interop.Word.Application, time As Double)
        Dim w As Microsoft.Office.Interop.Word.Application = app
        w.Selection.Find.ClearFormatting()
        w.Selection.Find.Replacement.ClearFormatting()

        With w.Selection.Find
            .Text = "^p"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchByte = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        w.Selection.Find.Execute(Replace:=WdReplace.wdReplaceAll)

       

        w.Selection.Find.ClearFormatting()

        With w.Selection.Find
            .Text = "\"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchByte = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With

        w.Selection.SetRange(0, 0)
        While w.Selection.Find.Execute()
            w.selection.copy

            Dim t, i As Single
            t = Timer
            Do
                i += 1
            Loop While Timer - t < time
            w.Selection.PasteAndFormat(WdRecoveryType.wdFormatPlainText)
        End While
    End Sub


End Module

该处使用的url网络请求的数据。


总结

其实公式转换应用非常多,LaTeX、omaths、mathtype相互转换应用非常广,其他公式的相互之间的转换请见本人博客专栏-office vba.

博主已封装好的vba/工程附件

vba版:vba版
vbnet版:vbnet版

TIPS:商用软件推荐

如果想用已经打包好的商业软件,要求大规模公式转换,请了解一下专业软件:GrindEQ.
使用方法与效果见本人博文:
在word中10秒一键将900个mathtype公式转换成word自带公式–GrindEQ公式转换神器

公式转换功能很优秀!
官网:官网
价格:价格链接

你可能感兴趣的:(office技巧与vba,mathtype相关,vba,vb.net)