2009-06-25 12 views
4

Ich muss eine große Anzahl von Ersetzungen in einigen Dokumenten durchführen, und die Sache ist, ich möchte diese Aufgabe automatisieren können. Einige der Dokumente enthalten allgemeine Zeichenfolgen, und dies wäre sehr nützlich, wenn sie automatisiert werden könnten. Von dem, was ich bisher gelesen habe, könnte COM eine Möglichkeit sein, dies zu tun, aber ich weiß nicht, ob Textersetzung unterstützt wird. Ich möchte diese Aufgabe in Python durchführen können? Ist es möglich? Können Sie ein Code-Snippet veröffentlichen, das zeigt, wie Sie auf den Dokumenttext zugreifen können?Kann ich Win32 COM verwenden, um Text in einem Worddokument zu ersetzen?

Danke!

Antwort

8

Sehen Sie, wenn this gibt Ihnen einen Start auf Word-Automatisierung mit Python.

Sobald Sie ein Dokument öffnen, können Sie Folgendes tun.
Nach dem folgenden Code können Sie das Dokument & eine andere öffnen.

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 

Der obige Code ersetzt den Text "Test" mit "test2" und macht einen "all ersetzen".
Sie können andere Optionen je nach Bedarf auf true/false setzen.

Der einfache Weg, dies zu lernen, ist ein Makro mit Aktionen zu erstellen, die Sie ergreifen möchten, siehe den generierten Code & verwenden Sie es in Ihrem eigenen Beispiel (mit/ohne geänderte Parameter).

EDIT: Nachdem er von Matthew irgend Code suchen, könnten Sie die folgende

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

tun und dann die oben VB-Code zu Python übersetzen.
Hinweis: Der folgende VB-Code ist eine Abkürzung für die Zuweisung von Eigenschaften ohne Verwendung der langen Syntax.

(VB)

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

Python

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

Pardon meine Python Wissen. Aber ich hoffe, Sie bekommen die Idee, voranzukommen.
Denken Sie daran, eine Speichern & Schließen Sie auf Dokument, nachdem Sie mit dem Suchen/Ersetzen-Vorgang fertig sind.

Am Ende könnten Sie MSWord.Quit aufrufen (um Word-Objekt aus dem Speicher freizugeben).

+0

Danke für die Antwort! – Geo

+0

Bernie Antwort enthält tatsächlichen kompletten Python-Code. Diese Antwort könnte etwas knapper sein und mehr vollständiges Python enthalten. – Epu

3

Wenn this mailing list post Recht, den Text des Dokuments Zugriff auf eine einfache wie:

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

Siehe auch How to: Search for and Replace Text in Documents. Die Beispiele verwenden VB und C#, aber die Grundlagen sollten auch für Python gelten.

+0

Danke für die Antwort! – Geo

10

Ich mag die Antworten so weit;
hier ist ein Beispiel getestet (leicht von here modifizierte)
, die alle Vorkommen einer Zeichenkette in einem Word-Dokument ersetzt:

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

Danke für die Antwort! – Geo

+0

Ich mag, dass dies ein komplettes Beispiel hat. – Epu

2

Sie auch dieser mit VBScript erreichen können. Geben Sie einfach den Code in eine Datei namens script.vbs, dann eine Eingabeaufforderung (Start -> Ausführen -> Cmd), dann wechseln Sie in den Ordner, in dem das Skript und Typ:

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 

+0

OP fragte vor allem nach Python. – Epu

Verwandte Themen