Сообщить об ошибке.

Объединить/разъединить ячейки модулем openpyxl

В материале рассказывается о методах модуля openpyxl, которые отвечают за такие свойства электронной таблицы как объединение/разъединение ячеек таблицы, а также особенности стилизации объединенных ячеек.

Содержание:


Объединение/слияние нескольких ячеек и их разъединение.

Модуль openpyxl поддерживает слияние/объединение нескольких ячеек, что очень удобно при записи в них текста, с последующим выравниванием. При слиянии/объединении ячеек, все ячейки, кроме верхней левой, удаляются с рабочего листа. Для переноса информации о границах объединенной ячейки, граничные ячейки объединенной ячейки, создаются как ячейки слияния, которые всегда имеют значение None.

Информацию о форматировании объединенных ячеек смотрите ниже, в подразделе "Оформление объединенных ячеек".

Пример слияния/объединения ячеек с модулем openpyxl:

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# объединить ячейки, находящиеся 
# в диапазоне `B2 : E2`
>>> ws.merge_cells('B2:E2')
# записываем текст в оставшуюся
# после объединения ячейку 'B2'
>>> ws['B2'] = 'Объединенные ячейки `B2 : E2`'
# сохраняем документ и смотрим что получилось
>>> wb.save("merge.xlsx")

При открытии сохраненного документа и перехода по любой ячейки из диапазона 'B2:E2' видно, что этот диапазон ячеек стал единым. Дополнительно исчезла возможность добавить значения к другим ячейкам этого диапазона.

Теперь разъединим ячейки, которые были объединены ранее, для этого загрузим сохраненный документ.

Пример разъединения ячеек с модулем openpyxl:

>>> from openpyxl import load_workbook
# загружаем сохраненный документ
>>> wb = load_workbook(filename = 'merge.xlsx')
>>> ws = wb.active
# теперь разъединим ячейки, 
# в диапазоне `B2 : E2`
>>> ws.unmerge_cells('B2:E2')
# сохраняем документ и смотрим что получилось
>>> wb.save("merge.xlsx")

При открытии сохраненного документа и перехода по любой ячейки из диапазона 'B2:E2' видно, что текст, записанный ранее в ячейку 'B2' принадлежит только ей. Дополнительно появилась возможность добавить значения к другим ячейкам диапазона 'B2:E2'.

Методы слияния ws.merge_cells() и разъединения ws.unmerge_cells() ячеек, кроме диапазона/среза ячеек могут принимать аргументы:

  • start_row: строка, с которой начинается слияние/разъединение.
  • start_column: колонка, с которой начинается слияние/разъединение.
  • end_row: строка, которой заканчивается слияние/разъединение.
  • end_column: колонка, которой заканчивается слияние/разъединение.

Пример:

# объединение ячеек
>>> ws.merge_cells(start_row=2, start_column=2, end_row=4, end_column=6)
# посмотрите что получилось
>>> wb.save("merge.xlsx")
# и разъединение ячеек
>>> ws.unmerge_cells(start_row=2, start_column=2, end_row=4, end_column=6)

Оформление/стилизация разъединенных ячеек модулем openpyxl.

Объединенная ячейка ведет себя аналогично другим объектам ячеек. Различие заключается лишь в том, что ее значение и формат записываются в левой верхней ячейке. Чтобы изменить, например, границу всей объединенной ячейки, необходимо изменить границу ее левой верхней ячейки.

Пример форматирования объединенной ячейки:

>>> from openpyxl import Workbook
>>> from openpyxl.styles import Border, Side, PatternFill, Font, Alignment
>>> wb = Workbook()
>>> ws = wb.active
# объединим ячейки в диапазоне `B2:E2`
>>> ws.merge_cells('B2:E2')
# в данном случае крайняя верхняя-левая ячейка это `B2`
>>> megre_cell = ws['B2']
# запишем в нее текст
>>> megre_cell.value = 'Объединенные ячейки `B2 : E2`'
# установить высоту строки
>>> ws.row_dimensions[2].height = 30
# установить ширину столбца
>>> ws.column_dimensions['B'].width = 40
# определим стили границ
>>> thins = Side(border_style="thin", color="0000ff")
>>> double = Side(border_style="double", color="ff0000")
# НАЧИНАЕМ ФОРМАТИРОВАНИЕ:
# границы объединенной ячейки
>>> megre_cell.border = Border(top=double, left=thins, right=thins, bottom=double)
# заливка ячейки
>>> megre_cell.fill = PatternFill("solid", fgColor="DDDDDD")
# шрифт ячейки
>>> megre_cell.font = Font(bold=True, color="FF0000", name='Arial', size=14)
# выравнивание текста
>>> megre_cell.alignment = Alignment(horizontal="center", vertical="center")
# сохраняем и смотрим что получилось
>>> wb.save("styled_megre.xlsx")

Дополнительно смотрите: