【问题标题】:how to export multiple files by Django如何通过Django导出多个文件
【发布时间】:2021-03-02 10:29:09
【问题描述】:

我可以在 Django 响应中返回多个文件吗?

通常,我看到很多网站都上传了多张图片。但是,我没有在多个图片或文件中看到响应。现在,我可以从 Django 导出一个 excel 文件,但我想同时导出多个 excel 文件。

以下代码从响应中导出单个 excel 文件

from openpyxl import Workbook    

response = HttpResponse(
    content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    )
response['Content-Disposition'] = 'attachment; filename={date}-user.xlsx'.format(
        date=datetime.now().strftime('%Y-%m-%d'),
        )
workbook = Workbook()

worksheet = workbook.active
worksheet.title = 'Test'
    
row_num = 1
columns   = ["Username", "First_name", "Last_name", "Email"]
for col_num, column_title in enumerate(columns, 1):
    cell = worksheet.cell(row=row_num, column=col_num)
    cell.value = column_title
        
user_queryset = User.objects.all().values("username", "first_name", "last_name", "email")
for user in user_queryset:
    row_num += 1
    
    # Define the data for each cell in the row 
    row = [
        user['username'],
        user['first_name'],
        user['last_name'],
        user['email'],
    ]
    
    # Assign the data for each cell of the row 
    for col_num, cell_value in enumerate(row, 1):
        cell = worksheet.cell(row=row_num, column=col_num)
        cell.value = cell_value

workbook.save(response)

return response

【问题讨论】:

标签: python django file export-to-excel


【解决方案1】:

我刚刚为我的问题找到了新的解决方案。我压缩了多个 excel 文件并将一个 zip 文件返回给响应。但我担心,这种方式好不好?或比此解决方案更好的其他方式

从日期时间导入日期时间、时间增量、日期

导入操作系统,压缩文件

from openpyxl import Workbook //(创建文件的库.xlsx)

openpyxl documentation

首先,我创建 file.xlsx 并使用 arr_name 收集 file.xlsx 的名称以在最终过程中删除

 arr_name = []
 for each_search in all_query_search :
    workbook = Workbook()

    # Get active worksheet/tab
    worksheet = workbook.active
    worksheet.title = 'Test'
    
    row_num = 1
    columns   = ["Username", "First_name", "Last_name", "Email"]
    for col_num, column_title in enumerate(columns, 1):
        cell = worksheet.cell(row=row_num, column=col_num)
        cell.value = column_title
        
    user_queryset = User.objects.filter(search = each_search).values("username", "first_name", "last_name", "email")
    for user in user_queryset:
        row_num += 1
    
        # Define the data for each cell in the row 
        row = [
            user['username'],
            user['first_name'],
            user['last_name'],
            user['email'],
        ]
    
        # Assign the data for each cell of the row 
        for col_num, cell_value in enumerate(row, 1):
            cell = worksheet.cell(row=row_num, column=col_num)
            cell.value = cell_value
    date = datetime.now().strftime('%d-%m-%Y')
    var_name = f"{date} {...some name for each file...}"
    workbook.save(var_name)
    arr_name.append(name) // collect name to delete
    

其次,我创建 zip 文件。如果 zip 未关闭,则响应将出错。

zipObj = zipfile.ZipFile('Reservation.zip', 'w', zipfile.ZIP_DEFLATED)
for name in arr_name:
    zipObj.write(name)
zipObj.close()

第三,我收集响应的 zip 文件。 (打开 zip 文件并读取响应)

response = HttpResponse(open('your_zip_file_name.zip', 'rb'),content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=Reservation.zip'

第四,我删除了所有过程中制作的文件

if arr_name:
    for name in arr_name:
        if os.path.exists(name):
            os.remove(name)
    os.remove("your_zip_file_name.zip")

最后,我返回响应

return response

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 2016-03-21
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多