2009-06-25 6 views
4

Je dois effectuer un grand nombre de remplacements dans certains documents, et la chose est, je voudrais être en mesure d'automatiser cette tâche. Certains documents contiennent des chaînes communes, ce qui serait très utile s'il pouvait être automatisé. D'après ce que j'ai lu jusqu'à présent, COM pourrait être un moyen de le faire, mais je ne sais pas si le remplacement de texte est pris en charge. J'aimerais pouvoir effectuer cette tâche en python? C'est possible? Pourriez-vous poster un extrait de code montrant comment accéder au texte du document?Puis-je utiliser Win32 COM pour remplacer du texte dans un document Word?

Merci!

Répondre

8

Voir si this vous donne un début sur l'automatisation des mots en utilisant python.

Une fois que vous avez ouvert un document, vous pouvez procéder comme suit.
Après le code suivant, vous pouvez Fermer le document & ouvrir un autre.

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 

Le code ci-dessus remplace le texte "test" par "test2" et effectue un "replace all".
Vous pouvez activer ou désactiver les autres options en fonction de ce dont vous avez besoin. La manière simple d'apprendre ceci est de créer une macro avec les actions que vous voulez prendre, voir le code généré & l'utiliser dans votre propre exemple (avec/sans paramètres modifiés).

EDIT: Après avoir regardé un code par Matthew, vous pouvez effectuer les opérations suivantes

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

Et puis traduire le code VB ci-dessus pour Python.
Remarque: Le code VB suivant est un moyen abrégé d'affecter une propriété sans utiliser la syntaxe longue.

(VB)

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

Python

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

Pardon my connaissance de python. Mais j'espère que vous aurez l'idée d'aller de l'avant.
N'oubliez pas de faire une sauvegarde & Fermez le document, une fois l'opération de recherche/remplacement terminée. En fin de compte, vous pouvez appeler le MSWord.Quit (pour libérer l'objet Word de la mémoire).

+0

Merci pour la réponse! – Geo

+0

La réponse de Bernie inclut le code Python complet actuel. Cette réponse pourrait être plus laconique et inclure un python plus complet. – Epu

3

Si this mailing list post est droit, l'accès au texte du document est un simple:

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

Voir aussi How to: Search for and Replace Text in Documents. Les exemples utilisent VB et C#, mais les bases devraient aussi s'appliquer à Python.

+0

Merci pour la réponse! – Geo

10

J'aime les réponses jusqu'à présent;
est ici un exemple testé (légèrement modifié de here)
qui remplace toutes les occurrences d'une chaîne dans un document 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') 
+1

Merci pour la réponse! – Geo

+0

J'aime que cela a un exemple complet. – Epu

2

Vous pouvez également y parvenir en utilisant VBScript. Il suffit de taper le code dans un fichier nommé script.vbs, puis ouvrez une invite de commande (Démarrer -> Exécuter -> cmd), puis passer au dossier dans lequel le script est et tapez:

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 a posé des questions sur python en particulier. – Epu

Questions connexes