Заполнение excel данными из модели django

Я заполнил модель Django фреймом данных pandas. Для этого я использовал функцию to_dict() для того, чтобы JSONField() модель Django приняла данные. Это нормально и работает хорошо. Но я пытаюсь заполнить этими данными файл excel. Поэтому я получаю доступ к данным в модели Django и пытаюсь использовать openpyxl для заполнения excel этими данными. Однако я сталкиваюсь с проблемами, поскольку получаю ошибку, говорящую, что не удается преобразовать данные в excel. Как можно это обойти?

Моя модель:

class myvalues(models.Model):
    items_list = models.JSONField()

функция, которая пытается заполнить excel:

values_to_go_into_excel_obtained_from_model = myvalues.objects.values_list(“items_list”, flat=True)
path = file_for_download.my_file.path
wb = load_workbook(path)
ws = wb["Sheet1"]
pd.read_excel(path, engine='openpyxl', sheet_name="Sheet1")

for row, v in enumerate(values_to_go_into_excel_obtained_from_model, 2):
    ws.cell(row, 4, v)

wb.save(path)

Есть идеи, почему я получаю эту ошибку. В основном я пытаюсь сделать следующее:

Step 1: pandas df -> Django model of type Json
Step 2: Access Django model values
Step 3: put values from Django model into excel file

У меня есть шаг 1 и 2, но я не могу получить шаг 3.

Если вы хотите сохранить один конкретный json в файл excel

df = pd.DataFrame(dictionary_from_query)

df.to_excel(filepath)

Или если вам нужно добавить несколько jsons, добавьте их в список, затем используйте этот список для инициализации dataframe

ds = []
for ...:      # your loop
    ds += [d] # where d is one of the dicts

df = pd.DataFrame(ds)

df.to_excel(filepath)

В вашем случае, я думаю, словари уже находятся в списке. Поэтому вы можете просто использовать второй метод

После https://stackoverflow.com/a/55131749/1021819, кажется возможным, что вы пытаетесь записать список в ячейку (что является способом спровоцировать ошибку, которую вы видите).

Так что вам нужно просмотреть список в цикле:

values_to_go_into_excel_obtained_from_model = myvalues.objects.values_list(“items_list”, flat=True)
path = file_for_download.my_file.path
wb = load_workbook(path)
ws = wb["Sheet1"]
# pd.read_excel(path, engine='openpyxl', sheet_name="Sheet1") # not required!
    
for row, v in enumerate(values_to_go_into_excel_obtained_from_model, 2):
    for row_val, i_row_val in enumerate(row):
        ws.cell(row_val, 4+i_row_val, v)
    
wb.save(path)

Пожалуйста, проверьте версию openpyxl.

openpyxl 3.0.2 имеет ошибку в генерации страниц Excel. Это может быть проблемой

Вернуться на верх