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. 总结:¶
- 实际上,WdInformation可以给出所有我们想要的信息,只需填入对应的枚举值即可。包括页码、行数、列数、光标等等。
- https://docs.microsoft.com/zh-cn/office/vba/api/word.wdinformation