Django:从数据库导出对象到Excel
我在我的模板中有这个:
<table> <tr><td>book_id</td><td>book name</td><td>book_author</td></tr> {% for book in books %} <tr><td>{{ book.book_id }}</td><td>{{ book.book_name }}</td><td>{{ book.book_author }}</td></tr> {% endfor %} </table> <a href="/export">Export to Excel !</a>
我的看法似乎是这样的:
def export_excel(request): books = Book.objects.all() response = HttpResponse(books , content_type='application/vnd.ms-excel;charset=utf-8') response['Content-Disposition'] = 'attachment; filename="books.xls"' return response
这里是urls.py
mu url:
url(r'^export$', 'export_excel', name='export_excel'),
它将文件导出到名为books.xls的文件中,这里的问题是将它们导出为第一个方格(A1)中的“书籍对象”
如果我想将每个“book_attribute”在单独的方块和每个“书”中分开放置,我应该怎么做?
您正在发送一个名为“books.xls”的东西,并正确表明这是一个Excel电子表格…但事实并非如此。 你完全错过了实际创build一个包含你的数据的Excel电子表格的步骤(这可能是这里工作的80%)。
尝试在网上search如何在Python中创build一个Excel电子表格。
工作示例使用tablib,一个出色的表格数据库库。
from django.http import HttpResponse import tablib headers = ('Book', 'Author') data = [] data = tablib.Dataset(*data, headers=headers) books = Book.objects.all() for book in books: data.append((book.book_name, book.author)) response = HttpResponse(data.xls, content_type='application/vnd.ms-excel;charset=utf-8') response['Content-Disposition'] = "attachment; filename=export.xls" return response
我认为问题在于你只是简单地将一个Book对象列表传递给你的导出文件。
books = Book.objects.all()
这一行只是返回一个对象列表。
我想你可能想迭代Book对象的每个属性。 用显示所有字段的元组replace每个书对象。 困难的办法是做一些像books_list = map(lambda x:(x.book_id,x.book_name,… Book的所有字段),books)
你通过books_list来导出文件,而不是书籍。
def export_excel(request): books = Book.objects.all() response = HttpResponse(books , content_type='application/vnd.ms-excel;charset=utf-8') response['Content-Disposition'] = 'attachment; filename="books.xls"' writer = csv.writer(response) writer.writerow(['Book', 'Author']) for book in books: writer.writerow([book.book_name, book.author]) return response
一个解决scheme使用我的插件: django_excel
import djang_excel as excel import pyexcel.ext.xls # in order to handle 'xls' format # import pyexcel.ext.xlsx # in order to handle 'xlsx' format # import pyexcel.ext.ods # in order to handle 'ods' format def export_excel(self, request): # Book as django model, 'xls' as file format response = excel.make_response_from_a_table(Book, 'xls') response['Content-Disposition'] = 'attachment; filename="books.xls"' return response