win32com批处理word时出现的问题记录

前面做一个项目,用Python批处理word文件,使用的是win32com的库包, 想要实现一个功能:获取某个特定关键字所在段落中的位置,同时要对这个关键字位置后面的文本内容进行某种处理,例如:给我一篇文章,要对文章中“程序员”关键字和“产品经理”关键字之间的字体内容进行处理

文章段落:XXXXXXXXXXXXX程序员?????????????????产品经理XXXXXXX 程序员??????????产品经理。(XXXXX和????都代表具体的文字)

如上面的例子,我要对段落中两段的????????进行处理。下面我们只探讨如何获取这些文本内容以及会出现的一些隐藏bug和解决方案

from win32com import client as wc

# 步骤(1)用gencache.EnsureDispatch而不用Dispatch的原因是:用Dispatch的话,执行后面代码wc.constants.wdGoToLine时会报错显示没有属性wdGoToLine,原因可以参考下面的链接
wordhandle= wc.gencache.EnsureDispatch("Word.Application")  

# 步骤(2)用户可能提前打开过word,并进行过搜索的动作,为了不遗漏关键字,首先运行Find.Execute之后,程序将从当前位置按照向文档开头执行搜索的原则进行关键字搜索,最后将当前所选内容移动到第一个关键字处
# targertText代表关键字;
# 倒数第五个参数设置为False,代表文章是从末尾向前搜索,True代表从开头向末尾搜索
while wordhandle.Selection.Find.Execute(targetText,False, False, False, False, False, False, 0, True,"",0):
    pass
try:
	#步骤(3)目前所选区域处于第一个关键字处,但是如果接着执行Find.Execute进行搜索的话,会跳过第一个关键字,
	# 所以我将光标向上移动一行或者也可以进行其他移动动作,只要能够将所选区域移动到第一个关键字前面即可, 
	# 这样就不会遗漏第一个关键字,不执行此行代码会遗漏
	# 此代码的详细用法参考:https://learn.microsoft.com/zh-cn/office/vba/api/word.selection.goto, 链接中是vb的用法,此处是参考了vb的用法
    wordhandle.Selection.GoTo(wc.constants.wdGoToLine, wc.constants.wdGoToPrevious, Count=1)  
except Exception as e:
     logging.info("targetText go to previous line:%s",e)
     
# 步骤(4)全文从上往下搜索关键字
while wordhandle.Selection.Find.Execute(targetText,False, False, False, False, False, True, 0, True,"",0):  
    targetIndex = wordhandle.Selection.Range.Start  # 关键字中第一个字的位置,例如要搜索的关键字是“程序员”,则targetIndex是“程”在整篇word中的位置

同理再搜索“产品经理”这个关键字,找到“产”在整篇word中的位置即可。

另外还有个问题记录一下,如果代码一开始用的下面的代码

wordhandle= wc.gencache.EnsureDispatch("Word.Application")

又因为某些原因改成下面的代码,上面的例子中,如果不是需要执行步骤(3)中的代码,其实使用下面的代码即可,不需要用gencache.EnsureDispatch

wordhandle= wc.Dispatch("Word.Application")

程序会立即报错

AttributeError: module ‘win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x5’ has no attribute ‘XXXXX’
解决办法:删除目录C:\Users\用户名\AppData\Local\Temp目录下的gen_py文件,
此时使用wordhandle= wc.Dispatch("Word.Application")便不会再报错。
 wc.Dispatch("Word.Application")和wc.gencache.EnsureDispatch("Word.Application")在代码编写时的区别:


 1)使用Dispatch时,使用doc.Paragraphs或者doc.Sections等其他接口,在获取某个Paragraphs对象或者Sections对象时,要使用[],第一个Paragraphs或者Sections是从0开始,例如:doc.Paragraphs[0];
 使用gencache.EnsureDispatch时,使用doc.Paragraphs或者doc.Sections等其他接口,在获取某个Paragraphs对象或者Sections对象时,要使用(),第一个Paragraphs或者Sections是从1开始,例如:doc.Paragraphs(1);
 2)使用Dispatch时,使用Paragraphs对象时,开头字母不区分大小写,可以写成doc.Paragraphs,也可以写作doc.paragraphs,但是使用gencache.EnsureDispatch时,开头字母必须是大写,即doc.Paragraphs;

参考链接:https://www.coder.work/article/373820

你可能感兴趣的:(办公自动化,Python,word,python)