Как обьеденить ячейки в docx Python
Пытаюсь добиться такой таблицы:
Но не знаю как обьеденить ячейки колонки Factor в одну.
Моя таблица:

Мой код:
doc = docx.Document()
# данные таблицы без названий колонок
items = []
for i in range(len(report_doc.index)):
items.append((report_doc.index[i][0], report_doc.index[i][1], report_doc.values[i][0]))
# добавляем таблицу с одной строкой
# для заполнения названий колонок
table = doc.add_table(1, len(items[0]))
table.style = 'Table Grid'
# Получаем строку с колонками из добавленной таблицы
head_cells = table.rows[0].cells
# добавляем названия колонок
for i, item in enumerate(['Factor', 'Year', 'World value']):
p = head_cells[i].paragraphs[0]
# название колонки
p.add_run(item).bold = True
# выравниваем посередине
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
# добавляем данные к существующей таблице
for row in items:
# добавляем строку с ячейками к объекту таблицы
cells = table.add_row().cells
for i, item in enumerate(row):
# вставляем данные в ячейки
cells[i].text = str(item)
doc.save('test1.docx')
items:
[('6', '2007', 0.55), ('6', '2008', 0.69), ('6', '2009', 0.66), ('6', '2010', 0.63), ('6', '2011', 0.67), ('6', '2012', 0.68), ('6', '2013', 0.64), ('6', '2014', 0.7), ('6', '2015', 0.66), ('6', '2016', 0.66), ('6', '2017', 0.66), ('6', '2018', 0.67), ('6', '2019', 0.65)]
Ответы (1 шт):
Автор решения: Spatz
→ Ссылка
Для объединения ячеек используйте метод merge, например:
table.cell(1, 0).merge(table.cell(7, 0))
Более подробная информация здесь.
Вот один из возможных способов:
import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
# данные таблицы без названий колонок
items = [('6', '2007', 0.55),
('6', '2008', 0.69),
('6', '2009', 0.66),
('6', '2010', 0.63),
('6', '2011', 0.67),
('6', '2012', 0.68),
('6', '2016', 0.66),
('6', '2017', 0.66),
('7', '2018', 0.67),
('7', '2019', 0.65)]
doc = docx.Document()
# добавляем таблицу с одной строкой
# для заполнения названий колонок
table = doc.add_table(1, len(items[0]))
table.style = 'Table Grid'
# Получаем строку с колонками из добавленной таблицы
head_cells = table.rows[0].cells
# добавляем названия колонок
for i, item in enumerate(['Factor', 'Year', 'World value']):
p = head_cells[i].paragraphs[0]
# название колонки
p.add_run(item).bold = True
# выравниваем посередине
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
merge_on = ''
merge_from = 0
# добавляем данные к существующей таблице
for k, row in enumerate(items):
# добавляем строку с ячейками к объекту таблицы
cells = table.add_row().cells
for i, item in enumerate(row):
if i == 0:
if merge_on == item:
# пропускаем одинаковые значения
pass
else:
if k - merge_from > 1:
# есть дубли - объединяем
table.cell(merge_from + 1, 0).merge(table.cell(k, 0))
table.cell(merge_from + 1, 0).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
# открываем новый регион
merge_on = item
merge_from = k
cells[i].text = str(item)
else:
# вставляем данные в ячейки
cells[i].text = str(item)
if k - merge_from > 0:
# в хвосте остались дубли - объединяем
table.cell(merge_from + 1, 0).merge(table.cell(k + 1, 0))
table.cell(merge_from + 1, 0).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
doc.save('test1.docx')
