При редактировании файлов .docx
в Python python-docx
предоставляет некоторые свойства, но не другие. Свойства текста, такие как жирный шрифт, курсив и т. д., можно легко установить, но свойства ячеек, такие как заливка фона и границы, AFAIK невозможны.
Что вы можете сделать в python-docx
, так это просмотреть XML-файл ячейки, используя атрибут .xml
. Итак, cell._tc.xml
показывает, что свойства клеток хранятся в блоке <w:tcPr> ... </w:tcPr>
. Это может быть вложенная структура, например
<w:tcPr>
<w:tcW w:w = "1139" w:type = "dxa"/>
<w:tcBorders>
<w:left w:val = "single" w:sz = "4" w:space = "0" w:color = "000000"/>
<w:bottom w:val = "single" w:sz = "4" w:space = "0" w:color = "000000"/>
</w:tcBorders>
<w:shd w:fill = "FFDBB6" w:val = "clear"/>
</w:tcPr>
Я хотел бы скопировать точные свойства ячейки из одной ячейки в другую. Я пробовал:
<w:tcPr>
из одной ячейки в другую. Однако атрибут .xml
доступен только для чтения — python-docx
не позволяет напрямую устанавливать xml.for child in source_cell._tc.get_or_add_tcPr().iterchildren():
dest_cell._tc.get_or_add_tcPr().insert(child)
но это поднимает TypeError: Argument must be bytes or unicode, got 'CT_TcPr'
.
Как я могу этого добиться?
Спасибо @DerSchinken. Изменение свойств ячейки — одна из многих манипуляций, которые я выполняю. Большинство из них можно сделать в python-docx
, и было бы обидно использовать обходной путь для свойств ячеек...
@gnoodle, Но если эта функция не встроена заранее, ее придется создать. Поэтому было бы полезно начать со ссылки или чего-то подобного, чтобы проверить, существует ли эта функция или нет.
Вот функция, которая копирует свойства из одной ячейки в другую:
def copy_cell_properties(source_cell, dest_cell):
'''Copies cell properties from source cell to destination cell.
Copies cell background shading, borders etc. in a python-docx Document.
Args:
source_cell (docx.table._Cell): the source cell with desired formatting
dest_cell (docx.table._Cell): the destination cell to which to apply formatting
'''
# get properties from source cell
# (tcPr = table cell properties)
cell_properties = source_cell._tc.get_or_add_tcPr()
# remove any table cell properties from destination cell
# (otherwise, we end up with two <w:tcPr> ... </w:tcPr> blocks)
dest_cell._tc.remove(dest_cell._tc.get_or_add_tcPr())
# make a shallow copy of the source cell properties
# (otherwise, properties get *moved* from source to destination)
cell_properties = copy.copy(cell_properties)
# append the copy of properties from the source cell, to the destination cell
dest_cell._tc.append(cell_properties)
Здесь есть соответствующее обсуждение - https://github.com/python-openxml/python-docx/issues/205
> «python-docx не позволяет напрямую устанавливать XML». Ну вот, ты не можешь. Однако вы можете изменить окончание файла
.docx
на.zip
, открыть его, а затем напрямую редактировать XML-документ. Неофициальное введение в DOCX