Как разъединить объединенную ячейку и записать данные в каждую ячейку?

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

Прикладываю пример того как нужно (левая часть)

63c483743428e735658937.png

Пользуюсь библиотекой openpyxl
На данный момент код выглядит так, решение витает в воздухе но я в тупике.
#
    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)
  • Вопрос задан
  • 991 просмотр
Решения вопроса 1
s0lgryn
@s0lgryn Автор вопроса
Спасибо YK21

Сохранить значение из первой во временной переменной и подставить в цикле в каждую ячейку из дипазона

и Akina за советы
Подход простой.

В диапазоне проходите по ячейкам. Каждую проверяете на объединённость. Если очередная ячейка не объединена - сканируете дальше.

Если объединена, то:

Считываете и запоминаете значение как скалярную величину (не как массив! это важно).
Считываете и запоминаете адрес и размер.
Убираете объединение.
Выделяете отдельные ячейки, которые были раньше объединены (по адресу и размеру).
Вставляете значение в выделение - оно будет вставлено в каждую ячейку диапазона назначения.


Мое решение, возможно нелогичный велосипед, но работает
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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы