web-dev-qa-db-ja.com

django Excel xlwt

Djangoサイトで、データベース内のいくつかのデータに基づいてExcelファイルを生成したいと思います。

xlwt を使用することを考えていますが、データをファイルに保存する方法しかありません。ファイルをHttpResponseオブジェクトに取得するにはどうすればよいですか?それとも、もっと良いライブラリを知っていますか?

私もこれを見つけました スニペット しかしそれは私が必要とすることをしません。私が欲しいのは、xlwtオブジェクトから応答オブジェクトにストリームを取得する方法です(一時ファイルに書き込むことなく)

34
Adrian Mester

きちんとしたパッケージ!私はこれについて知りませんでした

ドキュメントによると、save(filename_or_stream)メソッドは、保存するファイル名、または書き込むファイルのようなストリームのいずれかを取ります。

そして、Django応答オブジェクトはたまたまファイルのようなストリームです!だからxls.save(response)を実行してください。Djangoに関するドキュメントを見てください- PDFの生成 ReportLabで同様の状況を確認します。

編集:(ShawnMiloのコメントから採用):

def xls_to_response(xls, fname):
    response = HttpResponse(mimetype="application/ms-Excel")
    response['Content-Disposition'] = 'attachment; filename=%s' % fname
    xls.save(response)
    return response

次に、ビュー関数から、xlsオブジェクトを作成し、で終了します。

return xls_to_response(xls,'foo.xls')
55
Javier

***更新:Django-Excel-テンプレートは維持されなくなりました。代わりにMarmirを試してください http://brianray.github.com/mm/

私がこれを入力するとまだ開発中ですが http://code.google.com/p/Django-Excel-templates/ Django Excelテンプレートプロジェクトは何をすることを目的としていますあなたの質問。

具体的にはテストを見てください。簡単なケースは次のとおりです。

#
from Django_Excel_templates import *
from Django_Excel_templates.color_converter import *
from models import *
from Django.http import HttpResponse

def xls_simple(request):

    ## Simple ##
    testobj = Book.objects.all()

    formatter = ExcelFormatter()
    simpleStyle = ExcelStyle(vert=2,wrap=1)
    formatter.addBodyStyle(simpleStyle)
    formatter.setWidth('name,category,publish_date,bought_on',3000)
    formatter.setWidth('price',600)
    formatter.setWidth('ebook',1200)
    formatter.setWidth('about',20000)

    simple_report = ExcelReport()
    simple_report.addSheet("TestSimple")
    filter = ExcelFilter(order='name,category,publish_date,about,bought_on,price,ebook')
    simple_report.addQuerySet(testobj,REPORT_HORZ,formatter, filter)

    response = HttpResponse(simple_report.writeReport(),mimetype='application/ms-Excel')
    response['Content-Disposition'] = 'attachment; filename=simple_test.xls'
    return response
6
brianray

XLSファイルを StringIO オブジェクトに保存できます。これはファイルのようなものです。

StringIOオブジェクトのgetvalue()を応答で返すことができます。ダウンロード可能なスプレッドシートとしてマークするために、必ずヘッダーを追加してください。

2
S.Lott

serializers.queryset_to_xls()という関数が付属している Django を確認することをお勧めします。クエリセットをダウンロード可能なExcelシートに変換します。

2
max
1
satels

データ結果に数式や正確な表示スタイルが必要ない場合は、いつでもCSVを使用できます。スプレッドシートプログラムはそれを直接読み取ります。 CSVを生成するWebアプリを見たことがありますが、Excelで確実に開くために.XSLという名前を付けています

0
Javier