3.2. 利用matlab快速定位文字位置

本网页介绍了如何利用vba实现字符串的查找,并生成其位置 必须知道的网址: 微软的vba语法手册 - https://docs.microsoft.com/zh-cn/office/vba/api/word.wdinformation - https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa211923(v=office.11)

3.2.1. 1. 我们首先从vba开始

版本1: 网址 https://zhidao.baidu.com/question/2011085583766233188.html

Private Sub CommandButton1_Click()
   Dim p, r, s, t
    s= "石膏板造bai型顶"
   With Selection.Find
       .ClearFormatting
       .MatchWholeWord = True
       .MatchCase = False
       t = .Execute(FindText:=s)
   End With
    p= Selection.Information(wdActiveEndPageNumber)
    r= Selection.Information(wdFirstCharacterLineNumber)
   If t Then
       MsgBox "成功,已找到du“" & s & "”" & vbCrLf & _
           "页码:"& p & vbCrLf & "行数:zhi" & r, vbOKOnly, _
           "成功"
   Else
       MsgBox "很遗憾dao,没有找到“" & s & "”", vbOKOnly, _
           "遗憾"
   End If
End Sub

实例2:http://www.exceloffice.net/archives/3094

Sub QQ1722187970()
    Const wdActiveEndPageNumber = 3
    Const wdGoToHeading = 11
    Const wdGoToAbsolute = 1
    Const wdGoToPage = 1
    Dim oDoc As Document
    Dim oWord As Word.Application
    Set oWord = Word.Application
    Set oDoc = oWord.ActiveDocument
    Dim oRng As Range
    With oDoc
        iMin = -1
        I = 1
       Do
            '循环每个标题
            Set oRng = .GoTo(wdGoToHeading, wdGoToAbsolute, I)
            '如果到底或者回到头则退出循环
            If oRng.Start < iMin Or oRng.Start = iMin Then Exit Do
            '输出页码
             Debug.Print oRng.Information(wdActiveEndPageNumber)
            iMin = oRng.Start
            I = I + 1
      Loop Until 1 <> 1
    End With
End Sub

这是其他网友给出的vba版本,不在一一列举: - https://zhuanlan.zhihu.com/p/61358933 - http://www.360doc.com/content/18/0515/12/9261962_754100826.shtml -

3.2.2. 2. python/matlab版本

我们已经知道,vba语法是微软制定的,它与使用matlab。 如果我们直接将其翻译为python或matlab版本

import win32com

s="天津"
w = win32com.client.Dispatch('Word.Application')
w.Visible = 0;
w.DisplayAlerts = 0;
doc = w.Documents.Open(r'F:\天津科技大学\日常工作\2020\1月份\工程认证\最终材料\2020-7-29 版本\报告正文\自评报告正文-20200729--夏梦雷修订.docx');
w.Selection.Find.ClearFormatting();
w.Selection.Find.Replacement.ClearFormatting();
w.Selection.Find.MatchWholeWord = True
w.Selection.Find.MatchCase = False

while w.Selection.Find.Execute(s):
    p= w.Selection.Information(wdActiveEndPageNumber)
    print(p)

就会发现程序无法识别wdActiveEndPageNumber这个常量。

有的网友给出了一个解决思路: https://stackoverflow.com/questions/24005664/finding-the-current-page-in-word-document

该网友认为:wdActiveEndPageNumber是win32com.client模块中的一个常量,在代码之前导入即可:

from win32com.client.gencache import EnsureDispatch
from win32com.client import constants
word = EnsureDispatch("Word.Application")
mydoc = word.Documents.Open("path:\\to\\file")
mydoc.ActiveWindow.Selection.Information(constants.wdActiveEndPageNumber)

这种思路也是错误的,python依旧无法识别该变量,其实该网页的第二个网友给出的思路是正确的,即:wdActiveEndPageNumber是个枚举值,是一个int值,只需要在vba中找到该值就行。

在这种思路下,我们查找了微软的手册,以及部分网友的总结。 重要的网址如下: - https://docs.microsoft.com/zh-cn/office/vba/api/word.wdinformation

可以看出,wdActiveEndPageNumber枚举类型对应的是3,因此把对应的符号改为3即可。

值得注意的是,w.Selection.Find.Execute(s)至执行一次,也就是每次只执行以下,只需要做个循环,就可以把整个文档遍历完毕。

3.2.3. 3. 完整的python版本和matlab版本

3.2.3.1. 3.1 python版本

import win32com


s="天津"
w = win32com.client.Dispatch('Word.Application')
w.Visible = 0
w.DisplayAlerts = 0
doc = w.Documents.Open(r'F:\天津科技大学\日常工作\2020\1月份\工程认证\最终材料\2020-7-29 版本\报告正文\自评报告正文-20200729--夏梦雷修订.docx');
w.Selection.Find.ClearFormatting()
w.Selection.Find.Replacement.ClearFormatting()
w.Selection.Find.MatchWholeWord = True
w.Selection.Find.MatchCase = False

while w.Selection.Find.Execute(s):
    p= w.Selection.Information(3)
    print(p)

3.2.3.2. 3.2 Matlab版本

s='天津科技大学'
w=actxserver('Word.Application');
w.Visible = 0;
w.DisplayAlerts = 0;
doc = w.Documents.Open('F:\天津科技大学\日常工作\2020\1月份\工程认证\最终材料\2020-7-29 版本\报告正文\自评报告正文-20200729--夏梦雷修订.docx');
w.Selection.Find.ClearFormatting();
w.Selection.Find.Replacement.ClearFormatting();
w.Selection.Find.MatchWholeWord = true
w.Selection.Find.MatchCase = false


Num=0
while(w.Selection.Find.Execute(s))
    Num=Num+1;
    fprintf('运行了%d次',Num)
    disp( w.Selection.Information(3))
end

3.2.4. 总结:

3.2.5. 4. 本技术讲解视频

用户留言