#
wb = openpyxl.open(f"excel/10_2023-01-08_excel_schedule.xlsx", data_only=False, read_only=False)
ws = wb.active
merged_cells = list(map(str, ws.merged_cells.ranges)) # Получаю список объединенных диапазонов
# Разъединяю объединенные ячейки
for item in merged_cells:
ws.unmerge_cells(item)
wb.save("test_unmerge.xlsx")
print(merged_cells)
Сохранить значение из первой во временной переменной и подставить в цикле в каждую ячейку из дипазона
Подход простой.
В диапазоне проходите по ячейкам. Каждую проверяете на объединённость. Если очередная ячейка не объединена - сканируете дальше.
Если объединена, то:
Считываете и запоминаете значение как скалярную величину (не как массив! это важно).
Считываете и запоминаете адрес и размер.
Убираете объединение.
Выделяете отдельные ячейки, которые были раньше объединены (по адресу и размеру).
Вставляете значение в выделение - оно будет вставлено в каждую ячейку диапазона назначения.
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