Python win32com - Автоматизация Word - Как заменить текст в текстовом поле? - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь автоматизировать слово, чтобы заменить текст в документе Word, используя Python.(Я использую Word 2003, если это имеет значение, и Python 2.4)

Первая часть моего метода замены, приведенного ниже, работает со всем, кроме текста в текстовых полях.Текст просто не выделен.Я замечаю, когда я захожу в Word вручную и нажимаю Ctrl-A, весь текст выделяется, кроме текстового поля.

Вот мой код:

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')

Для shpРаздел self.app .. - это моя попытка поразить текстовые поля.Кажется, текстовое поле найдено, но оно ничего не заменяет.

1 Ответ

4 голосов
/ 11 июня 2010

Когда я добавляю текстовые поля в текстовый документ, они добавляются внутри холста для рисования.Поэтому форма верхнего уровня - это холст, а текстовые поля содержатся внутри холста.Вы должны использовать метод CanvasItems для доступа к объектам на холсте, то есть к текстовым полям

. Следующий пример работает для меня.Я создал текстовый документ с одним текстовым полем.

import win32com.client

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

Обновление: ответ на комментарий ОП.

Я думаю, что проблема с вашим кодом заключается в том, чтокаждая строка кода с Find создает новый объект Find.Вы должны создать и связать объект Find с именем, затем изменить его атрибуты и выполнить его.Итак, в вашем коде вы должны иметь:

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

или одну строку:

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

Оба эти метода работают в моем тестовом коде.

...