Сдвигать ячейки вверх, если целая строка пуста в Openpyxl

58
3

Я хочу удалить всю строку (сдвинуть ячейки вверх), если во всей строке нет значений. Я использую Openpyxl.

Мой код:

for row in range(1, ws1.max_row):
flag = 0
for col in range(1, 50):
if ws1.cell(row, col).value is not None:
flag = 1

if flag == 0:
ws1.delete_rows(row, 1)

Строки не удаляются в приведенном выше случае.

Я попытался использовать функцию iter_rows, чтобы сделать то же самое, и это дает мне:

TypeError: '>' not supported between instances of 'tuple' and 'int'

for row in ws1.iter_rows(min_row = 1, max_col=50, max_row = ws1.max_row):
flag = 0
for cell in row:
if cell.value is not None:
flag = 1

if flag == 0:
ws1.delete_rows(row, 1)

Помощь приветствуется!

спросил(а) 2018-05-31T10:30:00+03:00 2 года, 6 месяцев назад
1
Решение
84

Ниже приведен общий подход к поиску и удалению пустых строк.

empty_rows = []
for idx, row in enumerate(ws.iter_rows(max_col=50), start=1):

empty = not any((cell.value for cell in row))

if empty:
empty_rows.append(idx)

for row_idx in reversed(empty_rows):
ws.delete_rows(row_idx, 1)

ответил(а) 2018-05-31T13:20:00+03:00 2 года, 6 месяцев назад
41

Спасибо Чарли Кларку за помощь, вот работающее решение, которое я придумал, дайте мне знать, могу ли я внести в него какие-либо улучшения:


i = 1
emptyRows = []
for row in ws1.iter_rows(min_row = 1, max_col=50, max_row = ws1.max_row):
flag = 0
for cell in row:
if cell.value is not None:
flag = 1

if flag == 0:
emptyRows.append(i)

i += 1

for x in emptyRows:
ws1.delete_rows(x, 1)
emptyRows[:] = [y - 1 for y in emptyRows]

ответил(а) 2018-05-31T11:26:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема