Admin siteからExcel形式でmodelのデータを出力する汎用モジュール

前提として

xlwtがインストールされている必要があります。

仕様

  1. Admin siteのchange list画面で"Add"リンクの隣に"Export to .XLS"リンクを表示。
  2. "Export to .XLS"リンクをクリックするとダウンロードを開始します。

適用前

ExportExcel01

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 %}

適用後

ExportExcel02

これを元に色々なことが出来そうです :-)

twitter 2009-04-11 03:19:50.616768

関連ページ

参照サイト

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編