Как объединить ячейки в новом xlsx файле подобно тому, как это есть в исходном xlsx файле?
Друзья, используя библиотеку openpyxl, хочу скопировать определенные ячейки из одного xlsx файла в другой (новый). Скопировать ячейки получилось, как и скопировать их стили, но проблема возникла в другом: некоторые ячейки могут быть объединены (MergedCell) и при их вставке в новый xlsx файл они, конечно, не объединяются. Можете подсказать, в каком направлении думать и как эти ячейки объединить в новом файле подобно тому, как это есть в исходном xlsx файле?
Если нужно, то вот пример части кода:
import openpyxl
from copy import copy
path = r"C:\Users\somepath\example.xlsx"
head = "A1:J2" #Заголовок таблицы, в котором есть объединенные ячейки
wb = openpyxl.load_workbook(path)
ws = wb.worksheets[0]
wb2 = openpyxl.Workbook()
ws2 = wb2.active
for row_number, row in enumerate(ws[head]):
for col_number, cell in enumerate(row):
ws2.cell(row_number+1, col_number+1, cell.value)
if cell.has_style:
ws2.cell(row_number+1, col_number+1).font = copy(cell.font)
ws2.cell(row_number+1, col_number+1).fill = copy(cell.fill)
ws2.cell(row_number+1, col_number+1).border = copy(cell.border)
ws2.cell(row_number+1, col_number+1).number_format = copy(cell.number_format)
ws2.cell(row_number+1, col_number+1).protection = copy(cell.protection)
ws2.cell(row_number+1, col_number+1).alignment = copy(cell.alignment)
ws2.cell(row_number+1, col_number+1).quotePrefix = copy(cell. quotePrefix)
ws2.cell(row_number+1, col_number+1).pivotButton = copy(cell.pivotButton)
Ответы (2 шт):
Это не работает? Из документации openpyxl.worksheet.merge.MergeCells(count=None, mergeCell=())
for x in range(10):
ws.merge_cells(start_row=x, start_column=1, end_row=x, end_column=4)
Решение следующее: перед началом копирования ячеек в новый xlsx файл сначала необходимо объединить ячейки в новом xlsx файле, воспользовавшись методом ws.merge_cells(), который принимает параметры - start_row, start_column, end_row и end_column.
Чтобы получить координаты объединенных ячеек из исходного xlsx файла, я воспользовался ws.merged_cells.ranges, который возвращает список координатов объединенных ячеек на листе, например, A1:A2 или С1:F1 и т.д. (class 'openpyxl.worksheet.cell_range.CellRange').
Далее я воспользовался функцией openpyxl.utils.cell.range_boundaries(), которая в качестве параметра принимает строку-координату объединенной ячейки, например, "A1:A2" и возвращает tuple, где (min_col, min_row, max_col, max_row).
И эти координаты применил в качестве параметров ws.merge_cells() в новом xlsx файле.
Получившийся код, который работает:
import openpyxl
from copy import copy
from openpyxl.utils.cell import range_boundaries
path = r"C:\Users\somepath\example.xlsx"
head = "A1:J2" #Заголовок таблицы, в котором есть объединенные ячейки
wb = openpyxl.load_workbook(path)
ws = wb.worksheets[0]
wb2 = openpyxl.Workbook()
ws2 = wb2.active
for _range in ws.merged_cells.ranges:
boundaries = range_boundaries(str(_range))
ws2.merge_cells(start_column=boundaries[0], start_row=boundaries[1],
end_column=boundaries[2], end_row=boundaries[3])
for row_number, row in enumerate(ws[head]):
for col_number, cell in enumerate(row):
ws2.cell(row_number+1, col_number+1, cell.value)
if cell.has_style:
ws2.cell(row_number+1, col_number+1).font = copy(cell.font)
ws2.cell(row_number+1, col_number+1).fill = copy(cell.fill)
ws2.cell(row_number+1, col_number+1).border = copy(cell.border)
ws2.cell(row_number+1, col_number+1).number_format = copy(cell.number_format)
ws2.cell(row_number+1, col_number+1).protection = copy(cell.protection)
ws2.cell(row_number+1, col_number+1).alignment = copy(cell.alignment)
ws2.cell(row_number+1, col_number+1).quotePrefix = copy(cell.quotePrefix)
ws2.cell(row_number+1, col_number+1).pivotButton = copy(cell.pivotButton)