Могу ли я использовать Win32 COM для замены текста внутри документа Word?

Мне нужно выполнить большое количество замен в некоторых документах, и дело в том, что я хотел бы иметь возможность автоматизировать эту задачу. Некоторые документы содержат общие строки, и это было бы очень полезно, если бы их можно было автоматизировать. Из того, что я читал до сих пор, COM может быть одним из способов сделать это, но я не знаю, поддерживается ли замена текста. Я хотел бы иметь возможность выполнить эту задачу в python? Является ли это возможным? Не могли бы вы опубликовать фрагмент кода, показывающий, как получить доступ к тексту документа?

Спасибо!


person Geo    schedule 25.06.2009    source источник


Ответы (5)


Посмотрите, поможет ли это начать автоматизация слов с помощью python.

Открыв документ, вы можете сделать следующее.
После следующего кода вы можете закрыть документ и открыть другой.

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "test"
    .Replacement.Text = "test2"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Приведенный выше код заменяет текст "test" на "test2" и выполняет "заменить все".
Вы можете установить другие параметры в true/false в зависимости от того, что вам нужно.

Самый простой способ научиться этому — создать макрос с действиями, которые вы хотите выполнить, просмотреть сгенерированный код и использовать его в своем собственном примере (с измененными параметрами или без них).

РЕДАКТИРОВАТЬ: после просмотра некоторого кода Мэтью вы можете сделать следующее

MSWord.Documents.Open(filename)
Selection = MSWord.Selection

Затем переведите приведенный выше код VB на Python.
Примечание. Следующий код VB представляет собой сокращенный способ присвоения свойства без использования длинного синтаксиса.

(VB)

With Selection.Find
    .Text = "test"
    .Replacement.Text = "test2"
End With

питон

find = Selection.Find
find.Text = "test"
find.Replacement.Text = "test2"

Простите мое знание Python. Но я надеюсь, что вы поняли идею двигаться дальше.
Не забудьте выполнить команду "Сохранить и закрыть документ" после завершения операции поиска/замены.

В конце концов, вы можете вызвать MSWord.Quit (чтобы освободить объект Word из памяти).

person shahkalpeshp    schedule 25.06.2009
comment
Ответ Берни включает фактический полный код Python. Этот ответ мог бы быть более кратким и включать более полный Python. - person Epu; 28.03.2013
comment
Как выделить текст в документе Word с помощью win32? - person Anonymous; 10.12.2020

Пока мне нравятся ответы;
вот проверенный пример (слегка измененный из здесь),
который заменяет все вхождения строки в документе Word:

import win32com.client

def search_replace_all(word_file, find_str, replace_str):
    ''' replace all occurrences of `find_str` w/ `replace_str` in `word_file` '''
    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(word_file)

    # expression.Execute(FindText, MatchCase, MatchWholeWord,
    #   MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, 
    #   Wrap, Format, ReplaceWith, Replace)
    app.Selection.Find.Execute(find_str, False, False, False, False, False, \
        True, wdFindContinue, False, replace_str, wdReplaceAll)
    app.ActiveDocument.Close(SaveChanges=True)
    app.Quit()

f = 'c:/path/to/my/word.doc'
search_replace_all(f, 'string_to_be_replaced', 'replacement_str')
person mechanical_meat    schedule 25.06.2009
comment
Мне нравится, что у этого есть полный пример. - person Epu; 28.03.2013
comment
Как выделить текст в документе Word с помощью win32? - person Anonymous; 10.12.2020

Если эта запись списка рассылки верна, доступ к текст документа прост, как:

MSWord = win32com.client.Dispatch("Word.Application")
MSWord.Visible = 0 
MSWord.Documents.Open(filename)
docText = MSWord.Documents[0].Content

Также см. Как искать и заменять текст в документах. В примерах используются VB и C#, но основы применимы и к Python.

person Matthew Flaschen    schedule 25.06.2009

Перейдите по этой ссылке: http://python.net/crew/pirx/spam7/

Ссылки слева указывают на документацию.

Вы можете обобщить это, используя объектную модель, которую можно найти здесь:

http://msdn.microsoft.com/en-us/library/kw65a0we(VS.80).aspx

person Christopher    schedule 25.06.2009

Этого также можно добиться с помощью VBScript. Просто введите код в файл с именем script.vbs, затем откройте командную строку (Пуск -> Выполнить -> Cmd), затем перейдите в папку, где находится скрипт, и введите:

cscript script.vbs 


strFolder = "C:\Files"

Const wdFormatDocument  = 0

'Select all files in strFolder
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='" & strFolder & "'} Where " _
        & "ResultClass = CIM_DataFile")

'Start MS Word
Set objWord = CreateObject("Word.Application")

Const wdReplaceAll = 2
Const wdOrientLandscape = 1


For Each objFile in colFiles
    If objFile.Extension = "doc" Then
        strFile = strFolder & "\" & objFile.FileName & "." & objFile.Extension
        strNewFile = strFolder & "\" & objFile.FileName & ".doc"
        Wscript.Echo "Processing " & objFile.Name & "..."

        Set objDoc = objWord.Documents.Open(strFile)

        objDoc.PageSetup.Orientation = wdOrientLandscape

        'Replace text - ^p in a string stands for new paragraph; ^m stands for page break
        Set objSelection = objWord.Selection
        objSelection.Find.Text = "String to replace"
        objSelection.Find.Forward = TRUE
        objSelection.Find.Replacement.Text = "New string"

        objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll

        objDoc.SaveAs strNewFile, wdFormatDocument
        objDoc.Close
        Wscript.Echo "Ready"
    End If
Next

objWord.Quit

person Ra.    schedule 30.06.2009
comment
ОП спросил, в частности, о питоне. - person Epu; 28.03.2013