【问题标题】:How do I populate (update) an excel workbook with data from a django model?如何使用 django 模型中的数据填充(更新)excel 工作簿?
【发布时间】:2022-01-15 06:04:20
【问题描述】:

我用 pandas 数据框填充了一个 Django 模型。

为了做到这一点,我使用了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 步。

【问题讨论】:

  • 你的问题不是很清楚。不确定models.JSONField() 它应该像jsonfield.JSONField() 似乎你试图手动放置部分代码。此外,load_workbook 和其余代码表明您正在尝试通过添加一个新单元格来更新 Excel。请分享您遇到的错误的快照以及您的myvalues 模型的一些示例数据。
  • 您遇到的错误是什么?
  • 请分享示例数据和预期输出。错误在哪一行?

标签: python python-3.x django django-models openpyxl


【解决方案1】:

如果您想将一个特定的 json 保存到 excel 文件中

df = pd.DataFrame(dictionary_from_query)

df.to_excel(filepath)

或者如果您需要添加多个 json,请将它们添加到一个列表中,然后使用该列表来初始化数据框

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

df = pd.DataFrame(ds)

df.to_excel(filepath)

在您的情况下,我认为字典已经在列表中。因此,您可以只使用第二种方法。

【讨论】:

    【解决方案2】:

    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)
    
    

    【讨论】:

      【解决方案3】:

      请检查您的 openpyxl 版本。

      openpyxl 3.0.2 在生成 Excel 页面时存在错误。这可能是问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多