Я пытаюсь заменить текст в таблице в файле .docx на Python.Я довольно плохо знаком с Python, поэтому вот код, который я объясню позже ...
from typing import List, Any
from docx import Document
import re
import sys
label_name = sys.argv[1:][0]
file_name = "MyDocFile.docx"
doc = Document(file_name)
cell_text_array = []
target_index = 0
def index_cells(doc_obj):
global cell_text_array
for table in doc_obj.tables:
for row in table.rows:
for cell in row.cells:
cell_text_array.append(cell.text)
def docx_replace_regex(doc_obj, regex, replace):
global cell_text_array
for p in doc_obj.paragraphs:
if regex.search(p.text):
inline = p.runs
# Loop added to work with runs (strings with same style)
for i in range(len(inline)):
if regex.search(inline[i].text):
text = regex.sub(replace, inline[i].text)
inline[i].text = text
for table in doc_obj.tables:
for row in table.rows:
for cell in row.cells:
docx_replace_regex(cell, regex, replace)
# index the cells in the document
index_cells(doc)
# everything after: /myregex/
target_index = cell_text_array.index('myregex')
# the text that I actually need is 3 spots after 'myregex'
target_index += 3
former_label = cell_text_array[target_index]
# find regex and replace
regex1 = re.compile(re.escape(r"" + former_label))
replace1 = r"" + label_name
print(regex1)
print(replace1)
# call the replace function and save what has been replaced
docx_replace_regex(doc, regex1, replace1)
doc.save('result1.docx')
Первая функция index_cells () в основном открывает MyDocFile.docx и ищет каждую строку изтаблицы, которые есть в файле .docx, и сохраняют их в cell_text_array [].Я взял следующую функцию из Интернета, потому что я обычно не пишу код на Python, но я вынужден в этом случае (я не могу использовать модуль Ruby 'docx' по разным причинам).Таким образом, docx_replace_regex () делает именно то, что предлагает его имя: открывает файл .docx, находит текст, который нужно заменить, и заменяет его на «заменить» (даже если текст, который нужно заменить, находится в таблице или другом абзаце).
То, что я пытаюсь сделать, это в основном передать новое имя / метку / тег (как вы хотите это называть) в качестве параметра в файл и изменить старое имя / метку / тег изФайл .docx с параметром и сохраните только что отредактированный файл .docx в другой новый файл .docx.
Этот код работает нормально, если имя / метка / метка, которую я пытаюсь заменить, не имеет точек.На самом деле, я тестировал его на других строках из таблиц, и он работал просто отлично.Поскольку это имя / тег / метка содержит точки, мне пришлось использовать re.compile (re.escape ()), чтобы точки не считались специальными символами, и я подумал, что это должно работать, но по какой-то причине после создания нового файла,ничего не изменилось.
Я распечатал 'regex1' и 'replace1', чтобы увидеть, что дает.«Regex1» имеет следующий формат: re.compile («tag \ .name \ .label»), а «replace1» - это просто tag.name.label без каких-либо «» или «».Я думаю, что это может быть проблемой для неправильного поведения, но я не уверен, так как я очень плохо знаком с Python.
Может кто-нибудь помочь мне с этим?Я что-то упускаю?