Вопрос по winapi, replace, ms-word, python, com – Могу ли я использовать Win32 COM для замены текста в текстовом документе?

4

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

Спасибо!

Ваш Ответ

5   ответов
8

Видишь ли, еслиэтот дает вам начало автоматизации слов с помощью Python.

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

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

Приведенный выше код заменяет текст «тест» с & quot; test2 & quot; и "заменить все".
Вы можете включить / выключить другие параметры в зависимости от того, что вам нужно.

Простой способ узнать это - создать макрос с действиями, которые вы хотите выполнить, см. Сгенерированный код & amp; используйте его в своем собственном примере (с / без измененных параметров).

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

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. Но я надеюсь, что у вас есть идея двигаться вперед.
Не забудьте сделать Save & amp; После завершения операции поиска / замены закройте документ.

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

Ответ Берни включает в себя фактический полный код Python. Этот ответ может быть более кратким и включать более полный Python.
Спасибо за ответ! Geo
2

Оформить заказ по этой ссылке:http://python.net/crew/pirx/spam7/

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

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

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

Спасибо за ответ! Geo
2

Вы также можете достичь этого, используя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

ОП спросил о питоне в частности.
10

Мне нравятся ответы до сих пор;
здесь проверенный пример (слегка измененный изВот)
который заменяет все вхождения строки в документе 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')
Мне нравится, что у этого есть полный пример.
Спасибо за ответ! Geo
3

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

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

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

Спасибо за ответ! Geo

Похожие вопросы