Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以使用Win32 COM替换word文档中的文本吗?_Python_Winapi_Com_Ms Word_Replace - Fatal编程技术网

Python 我可以使用Win32 COM替换word文档中的文本吗?

Python 我可以使用Win32 COM替换word文档中的文本吗?,python,winapi,com,ms-word,replace,Python,Winapi,Com,Ms Word,Replace,我必须在一些文档中执行大量替换,问题是,我希望能够自动化该任务。有些文档包含公共字符串,如果可以自动执行,这将非常有用。从我目前所读到的内容来看,COM可能是实现这一点的一种方法,但我不知道是否支持文本替换。 我希望能够在python中执行此任务?可能吗?你能发布一个代码片段来说明如何访问文档的文本吗 谢谢 签出此链接: 左侧的链接指向文档 您可以使用对象模型对此进行概括,如下所示: 如果正确,访问文档文本的方法很简单,如下所示: MSWord = win32com.client.Dispatc

我必须在一些文档中执行大量替换,问题是,我希望能够自动化该任务。有些文档包含公共字符串,如果可以自动执行,这将非常有用。从我目前所读到的内容来看,COM可能是实现这一点的一种方法,但我不知道是否支持文本替换。 我希望能够在python中执行此任务?可能吗?你能发布一个代码片段来说明如何访问文档的文本吗

谢谢

签出此链接:

左侧的链接指向文档

您可以使用对象模型对此进行概括,如下所示:

如果正确,访问文档文本的方法很简单,如下所示:

MSWord = win32com.client.Dispatch("Word.Application")
MSWord.Visible = 0 
MSWord.Documents.Open(filename)
docText = MSWord.Documents[0].Content
另见。这些示例使用VB和C#,但基础知识也应适用于Python。

请参阅“如果”为您提供了使用Python的word自动化的入门知识

打开文档后,您可以执行以下操作。
完成以下代码后,您可以关闭文档并打开另一个文档

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”,并执行“全部替换”。
您可以根据需要将其他选项设置为真/假

了解这一点的简单方法是创建一个包含您想要执行的操作的宏,请参阅生成的代码并在您自己的示例中使用它(带/不带修改的参数)

编辑:在看过Matthew的一些代码之后,您可以执行以下操作

MSWord.Documents.Open(filename)
Selection = MSWord.Selection
然后将上面的VB代码翻译成Python。
注意:下面的VB代码是在不使用长语法的情况下分配属性的简写方式

(VB)

蟒蛇

find = Selection.Find
find.Text = "test"
find.Replacement.Text = "test2"
请原谅我的python知识。但是,我希望你有继续前进的想法。
在完成查找/替换操作后,请记住保存并关闭文档


最后,您可以调用
MSWord.Quit
(从内存中释放Word对象)。

到目前为止,我喜欢这些答案
下面是一个经过测试的示例(稍作修改)
替换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')

您也可以使用VBScript实现这一点。只需将代码键入名为
script.vbs
的文件,然后打开命令提示符(开始->运行->命令),然后切换到脚本所在的文件夹并键入:

cscript script.vbs 

OP特别询问了python,Bernie的回答包括实际完整的python代码。这个答案可能更简洁,并且包含更完整的python。如何使用win32突出显示word文档中的文本?我喜欢这有一个完整的示例。如何使用win32突出显示word文档中的文本?
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