我正在尝试使用 python 和 win32 组件自动化 Word(2010) 文档(所有大多数 40-50 文档)。具体而言,需要选择行的一部分并将其全部替换为一些内容。例如,如果在原始文件中有“标签:096-4296-05A ”,我希望将其替换为“标签:_ __ _ __ _ ____ ”。仅当所有文件中存在的数字相同时,使用搜索和替换才有效,但实际上并非如此。所以在那种情况下,我想要一个通用的方法来执行这个任务。
所以我在想的是,如果我能以某种方式选择包含“ Label 096-4296-05A ”的行并将其删除,然后再次写一个新行,如“ Label _ __ _ __ _ ”。
为此,我确实查看了@选择对象http://msdn.microsoft.com/en-us/library/bb221235%28v=office.12%29.aspx和http://msdn.microsoft.com/en- us/library/bb208865%28v=office.12%29.aspx甚至尝试为VB编写一些等效的python代码。
这是我到目前为止所写的:
...///
########################
#
# Purpose : Replace all occurrences of `find_str` with `replace_str`
# in `word_file
#
#######################
def delete_and_add_line(word_file, find_str, replace_str):
wdFindContinue = 1
wdReplaceAll = 2
# Dispatch() attempts to do a GetObject() before creating a new one.
# DispatchEx() just creates a new one.
app = win32com.client.DispatchEx("Word.Application")
app.Visible = 0
app.DisplayAlerts = 0
app.Documents.Open(IP_Directory_Dest + "\\" + word_file) ## (word_file)
# expression.Execute(FindText, MatchCase, MatchWholeWord,
# MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
# Wrap, Format, ReplaceWith, Replace)
app.Selection.Find.Execute(find_str, True, True, \
False, False, False, True, \
wdFindContinue, False, replace_str, wdReplaceAll)
app.Selection.EndKey(Extend=win32com.client.constants.wdExtend)##.Select()
# determine if the text is selected or not
if (app.Selection.Type == win32com.client.constants.wdSelectionIP ):
print 'Nothing is selected'
else:
print 'Text Selected '
# to delete the selected line
app.Selection.Delete()
app.ActiveDocument.Close(SaveChanges=True)
app.Quit()
...///
当我执行此代码时,我发现 app.Selection.Find.Execute 能够成功找到并替换提供给它的文本。即使它打印“Text Selected”,这意味着选择了行尾的文本,但它永远不会删除选定的行。
另外,我不确定这是否是完全选择一行直到其结束的正确方法(使用 Select 与此会给我属性错误“AttributeError:'int' object has no attribute 'Select'”)
**### **IS THIS THE CORRECT WAY TO SELECT A LINE TILL ITS END** ???**
app.Selection.EndKey(Extend=win32com.client.constants.wdExtend)##.Select()
如果我在这里遗漏了什么,请告诉我。欢迎任何建议。