Код находит целевую строку «123», но когда я сохраняю документ с замененными строками в новый файл (b.docx), содержимое остается неизменным — вместо замененного текста появляется исходный текст.
Мой текущий код перебирает все диапазоны историй, а также проверяет фигуры в верхние/нижние колонтитулы:
Проблемное поведение:
- Входной файл (a.docx) содержит: "Dahio1213dnuaidhaoi123455566-090-3211231sdasdo" + символы новой строки + "123" + новые строки + "123"
- После запуска сценария выходной файл (b.docx) имеет идентичное содержимое (без замен)
- Напечатанный счетчик замен показывает ненулевое число, что указывает на то, что совпадения были найдены.
- Разрешения файла нормальные; диалоговые окна Word не блокируются
- Использование doc.SaveAs2() с FileFormat=16 (wdFormatDocx)
- Итерация по StoryRange с помощью NextStoryRange
- Включение замены Shape.TextFrame в верхние и нижние колонтитулы
- Закрытие документа без сохранения перед SaveAs2
Как я могу гарантировать поиск и изменения «Заменить» действительно сохраняются?
Вот мой код
import win32com.client
from pathlib import Path
def replace_text(input_file: str, output_file: str, search_text: str, replace_text: str) -> int:
word = None
doc = None
try:
word = win32com.client.Dispatch("Word.Application")
word.Visible = False
word.DisplayAlerts = False
doc = word.Documents.Open(str(Path(input_file)))
wd_find_continue = 1
wd_replace_all = 2
wd_format_docx = 16
total_replaced = 0
story = doc.StoryRanges(1)
while story is not None:
rng = story
finder = rng.Find
finder.ClearFormatting()
finder.Text = search_text
finder.Replacement.Text = replace_text
finder.MatchCase = False
finder.MatchWholeWord = False
finder.MatchWildcards = False
finder.MatchSoundsLike = False
finder.MatchAllWordForms = False
finder.Forward = True
finder.Wrap = wd_find_continue
occurrences = rng.Text.lower().count(search_text.lower())
if occurrences:
finder.Execute(FindText=search_text, ReplaceWith=replace_text, Replace=wd_replace_all)
total_replaced += occurrences
story = story.NextStoryRange
doc.SaveAs2(str(Path(output_file)), FileFormat=wd_format_docx)
return total_replaced
finally:
if doc is not None:
try:
doc.Close(SaveChanges=False)
except Exception:
pass
if word is not None:
try:
word.Quit()
except Exception:
pass
def main():
input_file = r"E:\Document\\a.docx"
output_file = r"E:\Document\\b.docx"
search_text = "123"
replace_text_value = "abc"
count = replace_text(input_file, output_file, search_text, replace_text_value)
print(f"count: {count}")
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/798 ... to-a-new-w
Мобильная версия