openpyxl в Python функция delete_rows разбивает объединенную ячейку - PullRequest
0 голосов
/ 14 февраля 2019

Я использую openpyxl 2.6.0 в Python3 (с Django).

Я хочу манипулировать моим листом Excel Skelton (некоторые ячейки объединены), чтобы удалить строку.Но после удаления строки объединенные ячейки больше не объединяются.

Я хочу сохранить объединенные ячейки, даже если некоторые строки удалены.

Код и образец Excel приведены ниже.

def excelsample(request):

    wb = openpyxl.load_workbook(os.path.join(settings.BASE_DIR, 'static', 'excel', 'sample.xlsx'))

    sheet = wb['Sheet1']
    sheet.delete_rows(6) # delete 6th row

    response = HttpResponse(content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename="{fn}"'.format(fn=urllib.parse.quote("excelsample.xlsx"))

    wb.save(response)

    return response

До:

enter image description here

После:

enter image description here

1 Ответ

0 голосов
/ 14 февраля 2019

Существует проблема на трекере ошибок openpyxl, покрывающая это.Он был помечен как недопустимый.

Основная проблема заключается в том, что для того, чтобы это работало, все объединенные диапазоны ячеек должны быть проверены и обновлены после удаления строки.Существует несколько сложных / сложных вопросов аналогичного характера, которые, как считается, имеют минимальную ценность и поэтому не были реализованы.

Вы можете сделать это самостоятельно, если это необходимо.На листе имеется атрибут (merged_cells), который можно обновить после удаления строки.

Код:

def delete_row_with_merged_ranges(sheet, idx):
    sheet.delete_rows(idx)
    for mcr in sheet.merged_cells:
        if idx < mcr.min_row:
            mcr.shift(row_shift=-1)
        elif idx <= mcr.max_row:
            mcr.shrink(bottom=1)

Код теста:

wb = openpyxl.load_workbook('csvfile.xlsx')

sheet = wb['Sheet2']
delete_row_with_merged_ranges(sheet, 6)

wb.save('csvfile2.xlsx')
...