Openpyxl считает, что пустые строки имеют содержимое, а новое содержимое не добавляется в правильную строку - PullRequest
0 голосов
/ 17 октября 2019

У меня есть книга Excel, которую я загружаю через Openpyxl. Однако по какой-то причине рабочая книга считает, что в строке 287–1024 есть пустые ячейки со значениями. Поэтому, когда я добавляю, он добавляется в строку 1025. Где я хочу добавить в строку 287.

Я написал некоторый код для обработки пустых строк и использую функцию openpyxl ws.delete_rows(idx), чтобы удалить эти пустые строки,но теперь он не добавляет никаких данных ни в строку 287, ни в 1025. Я напечатал значения ws.max_row, и он указывает мне, что это 286.

РЕДАКТИРОВАТЬ

Но ничего добавляется либо в строку 287 , либо в строку 1025 после того, как я удалил эти None строки. Я подтвердил , открыв сохраненный файл Excel и не увидев добавленных строк при поиске всего документа.

Используемая версия openpyxl.__version__: openpyxl-2.6.4.

* 1025. * Это может быть видно в моем коде, прежде чем я добавлю новые значения, я печатаю оба ws.max_row и ws._current_row, и они оба печатают значение 286, которое является правильным.

Затем я печатаю ws._current_row после того, как ядобавьте значения, и это даст мне 287, что опять-таки правильно. Но данные по-прежнему не добавляются.

ВОЗМОЖНОЕ РЕШЕНИЕ

На данный момент я смог сделать быстрый обходной путь, удалив код для удаления пустых строк и вручную удалив ихв Excel и код, добавленный к 287-й строке. Но это не будет хорошо работать, когда кто-то захочет изменить файл, и в нем снова будут пустые строки.

решено

В моем первом цикле for я переписал valuesсписок, который должен был быть добавлен. Так что ничего не добавляется. Я изменил имя переменной в цикле for, и теперь она работает (см. Рабочую версию ниже).

    wb = load_workbook(common_dir_name +  'tracking.xlsx')
    ws = wb.active
    rows_to_delete = []
    for row in ws.iter_rows():
        cell_values = [cell.value for cell in row]
        if not any(cell_values):
            rows_to_delete.append(row[0].row)
    for x in reversed(rows_to_delete):
        ws.delete_rows(x)
    print(ws.max_row) #prints 286
    print(ws._current_row) #prints 286
    ws.append(values)
    print(ws._current_row) #prints 287
    wb.save(common_dir_name + "tracking.xlsx")
...