简体   繁体   English

Python win32com - 自动化Word - 如何替换文本框中的文本?

[英]Python win32com - Automating Word - How to replace text in a text box?

I'm trying to automate word to replace text in a word document using Python. 我正在尝试使用Python自动化word替换word文档中的文本。 (I'm on word 2003 if that matters and Python 2.4) (如果重要的话,我会在2003年的文字和Python 2.4)

The first part of my replace method below works on everything except text in text boxes. 我的替换方法的第一部分适用于除文本框中的文本之外的所有内容。 The text just doesn't get selected. 文本没有被选中。 I notice when I go into Word manually and hit ctrl-A all of the text gets selected except for the text box. 我注意到当我手动进入Word并按下ctrl-A时,除了文本框之外,所有文本都被选中。

Here's my code so far: 到目前为止,这是我的代码:

class Word:
    def __init__(self,visible=0,screenupdating=0):
        pythoncom.CoInitialize()
        self.app=gencache.EnsureDispatch(WORD)
        self.app.Visible = visible
        self.app.DisplayAlerts = 0
        self.app.ScreenUpdating = screenupdating
        print 'Starting word'
    def open(self,doc):
        self.opendoc=os.path.basename(doc)
        self.app.Documents.Open(FileName=doc)
    def replace(self,source,target):
        if target=='':target=' '
        alltext=self.app.Documents(self.opendoc).Range(Start=0,End=self.app.Documents(self.opendoc).Characters.Count) #select all
        alltext.Find.Text = source
        alltext.Find.Replacement.Text = target
        alltext.Find.Execute(Replace=1,Forward=True)
        #Special handling to do replace in text boxes
        #http://word.tips.net/Pages/T003879_Updating_a_Field_in_a_Text_Box.html
        for shp in self.app.Documents(self.opendoc).Shapes:
            if shp.TextFrame.HasText:
                shp.TextFrame.TextRange.Find.Text = source
                shp.TextFrame.TextRange.Find.Replacement.Text = target
                shp.TextFrame.TextRange.Find.Execute(Replace=1,Forward=True)

#My Usage
word=Word(visible=1,screenupdating=1)
word.open(r'C:\Invoice Automation\testTB.doc')
word.replace('[PGN]','1')

The for shp in self.app .. section is my attempt to hit the text boxes. self.app ..部分中的for shp是我尝试点击文本框。 It seems to find the text box, but it doesn't replace anything. 它似乎找到了文本框,但它并没有取代任何东西。

When I add text boxes to a word document, they are added inside a drawing canvas. 当我向word文档添加文本框时,它们会添加到绘图画布中。 Therefore the top level shape is the canvas, and the text boxes are contained within the canvas. 因此,顶级形状是画布,文本框包含在画布中。 You should use the CanvasItems method to access the objects in the canvas, ie the text boxes 您应该使用CanvasItems方法来访问画布中的对象,即文本框

The following example works for me. 以下示例适用于我。 I created a word document with a single text box. 我用一个文本框创建了一个word文档。

import win32com.client

word = win32com.client.Dispatch("Word.Application")
canvas = word.ActiveDocument.Shapes[0]
for item in canvas.CanvasItems:
    print item.TextFrame.TextRange.Text

Update: answering OP's comment. 更新:回答OP的评论。

I think the problem with your code is that each line of code with Find creates a new Find object. 我觉得你的代码的问题是与每一行代码Find创建一个新的Find对象。 You have to create and bind a Find object to a name, then modify its attributes and execute it. 您必须创建Find对象并将其绑定到名称,然后修改其属性并执行它。 So in your code you should have: 所以在你的代码中你应该有:

find = shp.TextFrame.TextRange.Find
find.Text = source
find.Replacement.Text = target
find.Execute(Replace=1, Forward=True)

Or a single line: 或者一行:

shp.TextFrame.TextRange.Find.Execute(FindText=source, ReplaceWith=target, Replace=1, Forward=True)

Both of these methods work in my test code. 这两种方法都适用于我的测试代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM