Admin siteからExcel形式でmodelのデータを出力する汎用モジュール
前提として
xlwtがインストールされている必要があります。
仕様
-
Admin siteのchange list画面で"Add"リンクの隣に"Export to .XLS"リンクを表示。
- "Export to .XLS"リンクをクリックするとダウンロードを開始します。
適用前
Excel出力処理をコーディング
"utils"ディレクトリを作成し、xls.pyファイルを作成します。
xls.py
import xlwt
import os
import tempfile
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponse
def admin_export_xls(request, app, model):
mc = ContentType.objects.get(app_label = app, model = model).model_class()
wb = xlwt.Workbook()
ws = wb.add_sheet(unicode(mc._meta.verbose_name_plural))
for i, f in enumerate(mc._meta.fields):
ws.write(0, i, f.name)
qs = mc.objects.all()
for ri, row in enumerate(qs):
for ci, f in enumerate(mc._meta.fields):
ws.write(ri+1, ci, unicode(getattr(row, f.name)))
fd, fn = tempfile.mkstemp()
os.close(fd)
wb.save(fn)
fh = open(fn, 'rb')
resp = fh.read()
fh.close()
response = HttpResponse(resp, mimetype = 'application/ms-excel')
response['Content-Disposition'] = 'attachment; filename = %s.xls' % \
(unicode(mc._meta.verbose_name_plural), )
return response
URLを設定する
urls.py
…
from utils.xls import admin_export_xls
…
urlpatterns = patterns('',
…
(r'^admin/([^\/]+)/([^\/]+)/xls/$', admin_export_xls),
(r'^admin/', include(admin.site.urls)),
…
)
テンプレートを修正
"MEDIA_ROOT"のディレクトリ直下にある"/admin/change_list.html"の
36-46行目を以下のように変更します。
change_list.html
{% block object-tools %}
<ul class = "object-tools">
{% if has_add_permission %}
<li>
<a href = "add/{% if is_popup %}?_popup=1{% endif %}" class = "addlink">
{% blocktrans with cl.opts.verbose_name as name %} Add {{ name }}{% endblocktrans %}
</a>
</li>
{% endif %}
<li>
<a href = "xls/" class = "viewsitelink">Export to .XLS</a>
</li>
</ul>
{% endblock %}
適用後
これを元に色々なことが出来そうです :-)

