Заполнение 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. Это может быть проблемой