大家好,我是Leo
首先抱歉上一篇標題打錯了
應該是openapi才對
今天來介紹的是如何製作api匯出excel檔案
OK~~~ Let's go now!!!
假設我們今天擁有動物的data資料,想要每天透過api生成excel
excel需要製作兩個分頁,分別是老年,幼年
假設物種為kitty and puppy的分別在excel內要框出不同顏色
我們該如何設計API呢?
希望透過API,一鍵產出表格
就讓我們繼續看下去唄
import pandas as pd
from rest_framework import generics, permissions
import datetime
from django.http import HttpResponse
from django.utils.encoding import escape_uri_path
try:
from io import BytesIO as IO # for modern python
except ImportError:
from io import StringIO as IO # for legacy python
class ToExcel(generics.GenericAPIView):
permission_classes = (permissions.AllowAny,)
authentication_classes = []
serializer_class = DataSerializer
def get(self, request):
df = pd.DataFrame(Data.objects.all().values('A','B','C'))
# 分為老年與幼年
df_young = df[(df['A']<10)]
df_old = df[(df['A']>=10)]
df_old = pd.DataFrame(list(df_old.T.to_dict().values()))
#在異常裡面出現kitty 在excel內列表成紅色
#在異常裡面出現puppy 在excel內列表成紫色
reds = []
purples = []
for i,not_normal in enumerate(df_old.iteritems()):
if not_normal[1] == 'kitty':
purples.append(i)
elif not_normal[1] == 'puppy':
reds.append(i)
# 上面定義的紫色紅色在下面生成至excel內
df_old = df_old.style.set_properties(subset=pd.IndexSlice[reds, :], **{'color': 'red'}) \
.set_properties(subset=pd.IndexSlice[purples, :], **{'color': 'purple'})
excel_file = IO()
writer = pd.ExcelWriter(excel_file,engine='xlsxwriter')
df_young.to_excel(writer, sheet_name='幼年', index=False)
df_old.to_excel(writer, sheet_name='老年', index=False)
writer.save()
excel_file.seek(0)
year,month,day =datetime.datetime.today().strftime("%Y-%m-%d").split('-')
filename = f"{year}年{month}月{day}日kitty與puppy.xlsx"
response = HttpResponse(
excel_file,
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
)
response['Content-Disposition'] = f"attachment; filename={escape_uri_path(filename)}"
return response
url.py and serializer and model 在這邊就不在重複設定了
可以依照自己的model,製作serializer,在設定自己的url透過get method
,當使用者點下按鈕呼叫get method function
就可以下載相對應的excel文件檔
是不是很有趣......
今天講解api製作 get method 產出excel文件檔
明天終於來到最後一篇的貼文了
說真的每天要po文真的不容易啊
希望有機會再挑戰,有興趣的議題
明天準備講解一下django的運用模式
我們明天見,各位掰掰~~~