質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5046閲覧

Django データベースのレコードのEXCEL出力について

nuko3

総合スコア31

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/04/20 07:37

編集2020/04/20 23:27

Djangoを用いたWEBサイトを作っていますが、クラスベースビューでデータベースを検索して一覧表示するのはできました。
そこに検索結果のEXCEL出力をしたいのですが、調べても全件出力の参考記事しか見つかりません。(内容的にCSVと同じなのでCSV出力の参考記事を探して作ってました)

理想は、出力ボタンクリック→検索フォームの値を取得し、取得した値でDBを検索→for文でEXCELを書き込んで出力。というような感じです。

出力用の関数を作って動作したのでビューに乗せようとした所、うまくいきません(理解が間違っている?)。
何かアドバイスありましたら教えて頂けると幸いです。

HTML

1 2<input type="submit" name="excel_export" value="エクセル出力">

Python

1#urls.py 2path('excel_export/', views.IndexView.excel_export, name='excel_export'),

Python

1#views.py 2class IndexView(generic.ListView): 3 model = dblist 4 template_name = 'mysite/index.html' 5 6 #検索、一覧表示 7 def get_context_data(self, **kwargs): 8 #省略 9 return context 10 11 #ボタンクリックでEXCEL出力 12 def excel_export(self, request): 13 #検索値取得 14 #start = self.request.GET.get('start') 15 #end = self.request.GET.get('end') 16 #SearchNAME = self.request.GET.get('SearchNAME') 17 18 output = BytesIO() 19 book = Workbook(output) 20 #シート名 21 sheet = book.add_worksheet('DBSearch') 22 #ヘッダー 第一引数が行、第二引数が列を表す 23 sheet.write(0,0, 'ID') 24 sheet.write(0,1, 'NAME') 25 26 #データベース検索 27 #とりあえず検索は固定値 28 #db_data = dblist.objects.filter(ID__gte=start,ID__lte=end,NAME__contains=SearchNAME).order_by('ID') 29 db_data = dblist.objects.filter(ID__gte='001',ID__lte='200',NAME__contains='太朗').order_by('ID') 30 31 row_num = 1 32 for data in db_data: 33 sheet.write(row_num, 0, data.ID) 34 sheet.write(row_num, 1, data.NAME) 35 36 row_num += 1 37 38 book.close() 39 40 # construct response 41 output.seek(0) 42 response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 43 response['Content-Disposition'] = "attachment; filename=DBList.xlsx" 44 45 return response

環境

Python 3.7
Django 2.1.15
pyodbc 4.0.30  (SQLServer接続)
XlsxWriter 1.2.8  (EXCEL出力)

PolymetisOutis7👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasami

2020/04/20 08:51

XlsxWriterを使用しているのでしょうか?使用しているパッケージを教えていただけないでしょうか?
nuko3

2020/04/20 10:27

hasami様。使用したパッケージを書き込みました
guest

回答2

0

自己解決

HTMLのボタンにURLを追加したら動くようになりました

<button type="button"onclick="location.href='{% url 'mysite:excel_export' %}'">エクセル出力</button>

投稿2020/04/21 00:34

nuko3

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何がうまくいかないのか不明ですが、下記のようにしたらどうなりますか?

python

1book = Workbook(output, {'in_memory': True, 'remove_timezone': True,})

in_memoryは、一時ファイルを使用せず、メモリ上にワークブックを作成するかを示すオプションです。
また、remove_timezoneは、タイムゾーン付きのdatetimeインスタンスをwrite_datetimeメソッドで出力する際に、自動的にタイムゾーンを削除するかを示すオプションです。

投稿2020/04/20 12:10

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuko3

2020/04/20 23:25

回答ありがとうございます。 上記のように変更してみても変化はありませんでした。 うまくいかない点は、エクセル出力のボタンを押すと、URLに'http://~~&excel_export=エクセル出力'と出てしまい、それだけで終わってしまう所です。関数の呼び出し方に問題があるのかなと思ってます。
hasami

2020/04/20 23:59

Excelファイルを返却する別のビューを作成して、getメソッドでexcel_exportメソッドのレスポンスを返却すればよいと思います。
nuko3

2020/04/21 00:31

すみません、問題を整理したはずが逆にごちゃ混ぜになってました… 最初から見直してみたら、HTMLのボタンにURLが入ってませんでした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問