如何使用excel格式导出python中的数据?

时间:2013-11-18 05:49:17

标签: python django

views.py

def export_to_excel(request):

    lists = MyModel.objects.all()

    # your excel html format
    template_name = "sample_excel_format.html"

    response = render_to_response(template_name, {'lists': lists})

    # this is the output file
    filename = "model.csv"

    response['Content-Disposition'] = 'attachment; filename='+filename
    response['Content-Type'] = 'application/vnd.ms-excel; charset=utf-16'
    return response

urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('app_name.views',
   url(r'^export/$', 'export_to_excel', name='export_to_excel'),  
)
  1. 最后,在您的页面中创建一个指向导出的按钮或链接。
  2. page.html中

    <a href="{% url app_name:export_to_excel %}">Export</a>
    

    没有获取下载的文件选项,也没有给出任何错误,但我可以看到日志中的所有结果都正常工作。

5 个答案:

答案 0 :(得分:7)

我认为导出excel文件的解决方案是:

   if 'excel' in request.POST:
        response = HttpResponse(content_type='application/vnd.ms-excel')
        response['Content-Disposition'] = 'attachment; filename=Report.xlsx'
        xlsx_data = WriteToExcel(weather_period, town)
        response.write(xlsx_data)
        return response

在此示例中,用于导出的库是xlsxWriter。 这是一个非常完整和实用的解决方案,以及许多其他解决方案:http://assist-software.net/blog/how-export-excel-files-python-django-application

答案 1 :(得分:4)

这似乎是基于通过更改文件名和MIME类型来欺骗excel打开HTML表的做法。为了使这项工作,HTML文件必须组装一个HTML表,这可能会触发警告,该文件的真实内容与声明的内容不同。

恕我直言,这是一个粗暴的黑客,应该避免。您可以使用xlwt module创建真实的Excel文件,也可以使用csv模块创建真实的CSV文件。

[更新]

在查看您提到的blog post之后,我看到它建议另一个不好的做法:使用除csv模块之外的任何内容来生成CSV文件是危险的,因为如果数据包含分隔符,引号或换行符,则可能最终导致错误的CSV。 csv模块将处理所有极端情况并生成适当的格式化输出。

我见过人们使用Django模板命名文件“something.xls”并使用HTML表格而不是CSV格式,但这也有一些极端情况。

答案 2 :(得分:4)

您似乎正在尝试使用HTML内容生成Excel工作簿。我不知道Excel(或LibreOffice)是否能够打开这样的文件,但我认为这不是正确的方法。

您应该生成一个excel文件:您可以xls使用csvxlsx使用xlwtimport xlwt wb = xlwt.Workbook() #use xlwt to fill the workbook # #ws = wb.add_sheet("sheet") #ws.write(0, 0, "something") response = HttpResponse(mimetype='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment; filename=the-file.xls' wb.save(response) return response 使用openpyxl

文件的内容可以传递给HttpResponse

例如,如果您使用xlwt:

{{1}}

您还可以查看

我希望它有所帮助

答案 3 :(得分:4)

除了其他答案中显示的选项外,您还可以使用XlsxWriter创建Excel文件。

请参阅this example

答案 4 :(得分:1)

将数据导出到XLS文件

如果确实需要导出到.xls文件,请使用它。您将能够添加粗体,字体大小,定义列大小等格式。

首先,安装xlwt模块。最简单的方法是使用pip。

pip install xlwt

views.py

import xlwt

from django.http import HttpResponse
from django.contrib.auth.models import User

def export_users_xls(request):
    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename="users.xls"'

    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('Users')

    # Sheet header, first row
    row_num = 0

    font_style = xlwt.XFStyle()
    font_style.font.bold = True

    columns = ['Username', 'First name', 'Last name', 'Email address', ]

    for col_num in range(len(columns)):
        ws.write(row_num, col_num, columns[col_num], font_style)

    # Sheet body, remaining rows
    font_style = xlwt.XFStyle()

    rows = User.objects.all().values_list('username', 'first_name', 'last_name', 'email')
    for row in rows:
        row_num += 1
        for col_num in range(len(row)):
            ws.write(row_num, col_num, row[col_num], font_style)

    wb.save(response)
    return response

urls.py

import views

urlpatterns = [
    ...
    url(r'^export/xls/$', views.export_users_xls, name='export_users_xls'),
]

template.html

<a href="{% url 'export_users_xls' %}">Export all users</a>

了解更多有关xlwt模块的信息,请阅读其官方文档。 https://simpleisbetterthancomplex.com/tutorial/2016/07/29/how-to-export-to-excel.html