python 3.5 -> 3.6 Tablib TypeError: cell() отсутствует 1 обязательный позиционный аргумент: 'column'

При переходе с python 3.5 на 3.6 мои модульные тесты выявили проблему с django-import-export & tablib:

TypeError: cell () отсутствует 1 обязательный позиционный аргумент: 'column'

File "<path>/lib/python3.6/site-packages/tablib/formats/_xlsx.py", line 122, in dset_sheet
    cell = ws.cell('%s%s' % (col_idx, row_number))
    TypeError: cell() missing 1 required positional argument: 'column'

Строка в таблице:

    cell = ws.cell('%s%s' % (col_idx, row_number))

Так что, действительно, нет никаких аргументов в пользу колонки

Код моего просмотра:

my_resource = MyModelResource(queryset=my_queryset)
dataset = my_resource.export()
response = HttpResponse(dataset.xlsx, content_type='application/vnd.ms-excel')

Это прекрасно работает в python3.5, но не работает под 3.6

requirements.txt:

...
tablib==0.12.1
django-import-export==0.7.0
Django==1.11.7
...

1 ответ

Решение

Это не имеет ничего общего с Python 3.5 или 3.6. У вас есть новее openpyxl версия установлена ​​с вашей версией 3.6 по сравнению с вашей установкой 3.5.

Версия, которую вы установили с 3.6, удалила устаревший параметр координат из worksheet.cell() метод и сделал row а также column обязательные аргументы. Это часть версии 2.5.0b1, выпущенной 2018-01-19 (две недели назад):

Большие перемены

worksheet.cell() больше не принимает параметр координат. Синтаксис сейчас ws.cell(row, column, value=None)

tablib Библиотека еще не приспособлена к этому изменению. Код должен просто передать номера столбцов и строк напрямую:

cell = ws.cell(row=row_number, column=col_idx)

Использование аргументов ключевого слова обеспечит совместимость вплоть до 1.1.0 (релиз, в котором добавлена ​​поддержка column а также row параметры, выпущенные в 2010 году).

В то же время, вы можете понизить openpyxl установка до версии 2.4.9, последняя версия без этих изменений.

Также смотрите выпуск № 324 в tablib хранилище проекта.

Другие вопросы по тегам