Django:从数据库导出对象到excel

时间:2013-04-12 14:08:31

标签: 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”分别放在单独的正方形和每个“book”中,我该怎么办?

5 个答案:

答案 0 :(得分:6)

您正在发送名为“books.xls”的内容,并正确地表明它是Excel电子表格......但事实并非如此。您完全错过了实际创建包含数据的Excel电子表格的步骤(这可能是此处工作的80%)。

尝试在网上搜索如何使用Python创建Excel电子表格。

答案 1 :(得分:3)

使用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

答案 2 :(得分:0)

我认为问题在于您只需将Book对象列表传递给导出文件即可。

books = Book.objects.all()

这一行只返回一个对象列表。

我想你可能想迭代Book对象的每个属性。 将每个Book对象替换为显示所有字段的元组。 艰难的方法是做类似的事情     books_list = map(lambda x:(x.book_id,x.book_name,....书的所有领域),书籍)

您将books_list传递给导出文件而不是书籍。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用我的插件的解决方案: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