from openpyxl.utils import range_boundaries
def unmerge_and_fill_cells(sheet: Worksheet) -> NoReturn:
for group in list(sheet.merged_cells.ranges):
min_col, min_row, max_col, max_row = range_boundaries(str(group))
top_left_cell_value = sheet.cell(row=min_row, column=min_col).value
sheet.unmerge_cells(str(group))
for row in sheet.iter_rows(min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row):
for cell in row:
cell.value = top_left_cell_value
Сохранить значение из первой во временной переменной и подставить в цикле в каждую ячейку из дипазона
Подход простой.
В диапазоне проходите по ячейкам. Каждую проверяете на объединённость. Если очередная ячейка не объединена - сканируете дальше.
Если объединена, то:
Считываете и запоминаете значение как скалярную величину (не как массив! это важно).
Считываете и запоминаете адрес и размер.
Убираете объединение.
Выделяете отдельные ячейки, которые были раньше объединены (по адресу и размеру).
Вставляете значение в выделение - оно будет вставлено в каждую ячейку диапазона назначения.
def prepare_sheet(sheet):
merged_cells = list(map(str, sheet.merged_cells.ranges)) # Получаю список объединенных диапазонов
# Разъединяю объединенные ячейки и дублирую запись
for item in merged_cells:
sheet.unmerge_cells(item)
merged_cells_range = item.split(":")
if merged_cells_range[0][0] == merged_cells_range[1][0]:
letter = item.split(":").pop(0)[0] # Символ столбца диапазона
start = int(item.split(":").pop(0)[1:]) # Начало диапазона
end = int(item.split(":").pop()[1:]) # Конец диапазона
copy_cell = sheet[(letter + str(start))].value
for n in range(start, end + 1):
cell = letter + str(n)
sheet[cell].value = copy_cell