中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django中admin后臺如何實現添加導出excel功能

發布時間:2021-07-10 11:35:42 來源:億速云 閱讀:286 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關django中admin后臺如何實現添加導出excel功能,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Django功能強大不單在于他先進的編程理念,很多現有的功能模塊更是可以直接拿來使用,比如這個牛掰的admin模塊,可以作為一個很好的信息登記管理系統。

admin模塊中的actioin是可以自定義添加的,比如這次要介紹的導出excel功能,就可以在action中觸發。

本文將詳細介紹如何導出admin中錄入的數據為excel,可以直接提交給你的leader觀看。

首先我們要安裝 xlwt 這個工具模塊:

pip install xlwt

import的準備 修改admin.py:

#-*-coding:utf-8 -*-
from django.contrib import admin
from .models import *
from django.http import StreamingHttpResponse
from django.shortcuts import render,HttpResponse,redirect
import xlwt
import os
from io import BytesIO

添加action:

class testAdmin(admin.ModelAdmin):
  list_display = ('a_name','b_level','...')
  actions = ["export_excel",]
  ...
  export_excel.short_description = "導出Excel文件"

添加后的效果如圖:

django中admin后臺如何實現添加導出excel功能

接下來編寫導出excel的功能函數:

  def export_excel(self, request, queryset): #三個參數必不可少,queryset是你要導出的文件名
    for i in queryset:  #這個for循環是為了在多選的時候只導出第一個文件,避免多個被同時導出
      filenames = str(i)
      break;
    response = HttpResponse(content_type='application/vnd.ms-excel')
    for i in Case_Study.objects.all().filter(a_name = filenames):
      filename = i.a_name
      filename = filename.encode('gb2312') #為了能將導出的excel命名為中文,必須轉成gb2312
      typess = 'attachment;filename='+filename+'.xls' #這一步命名導出的excel,為登記的case名稱
      response['Content-Disposition'] = typess
      #print typess
    # 創建一個文件對象
    wb = xlwt.Workbook(encoding='utf8')
    # 創建一個sheet對象
    sheet = wb.add_sheet('casestudy',cell_overwrite_ok=True) #創建的sheet名稱為casestudy,注意如果想要開啟覆蓋寫入,必須將overwrite功能開啟

接下來是定義字體和表格樣式:

# 接下里是定義表格的樣式,如果你想對不同的表格定義不同的樣式只能采用下面這種方式,否則將會默認成一種格式,即使定義了不同的變量,也會影響全局變量
    style_heading = xlwt.easyxf("""
          font: # 字體設置
            name Microsoft YaHei,  # 定義字體為微軟雅黑
            colour_index black,  # 字體顏色為黑色
            bold off,  # 不加粗
            height 200; #字體大小 此處的200實際對應的字號是10號
          align: # 對齊方式設置
            wrap off, #自動換行 關閉
            vert center, #上下居中
            horiz center; #左右居中
          pattern: #表格樣式設置
            pattern solid, 
            fore-colour white; # 表格顏色 白色
          borders: # 表格外框設置
            left THIN, #THIN 為實線
            right THIN,
            top THIN,
            bottom THIN; 
          """)
    style_playback = xlwt.easyxf("""
          font:
            name Microsoft YaHei,
            colour_index black,
            bold off,
            height 200;
          align:
            wrap 1, # 此處設置為1時表示開啟自動換行
            vert center,
            horiz left;
          pattern:
            pattern solid,
            fore-colour white;
          borders:
            left THIN,
            right THIN,
            top THIN,
            bottom THIN;
          """)
    style_time_s = xlwt.easyxf("""
          font:
            name Microsoft YaHei,
            colour_index black,
            bold off,
            height 200;
          align:
            wrap off,
            vert center,
            horiz center;
          pattern:
            pattern solid,
            fore-colour white;
          borders:
            left THIN,
            right THIN,
            top THIN,
            bottom THIN;
          """,num_format_str='YYYY-MM-DD') # 設置時間格式樣式為 2019-03-01
    style_time = style_heading
    style_time.num_format_str = 'YYYY-MM-DD hh:mm' # 設置時間格式樣式為 2019-03-01 17:30

接下來是合并單元格,這個是一個比較細的工作:

#合并單元格 順序是從0開始
    sheet.write_merge(0, 0, 1, 3,) # 參數說明為 從第0行到第0行的第1列到第3列合并
    sheet.write_merge(2, 3, 1, 5,) # 參數說明為 從第2行到第3行的第1列到第5列合并
    #多行執行相同的合并可以寫個for循環
    for i in range(6,12):
      sheet.write_merge(i,i,1,3,) #相當于在6到12行的第1列到第3列分別合并 如果這個邏輯繞不明白可以自己實踐一下
接下來是添加邊框,因為合并了單元格不等于自動加邊框,導致導出的表格里有未加邊框的情況,所以只能先行添加好

    #添加邊框,可以用兩個for來實現,具體邏輯可自行根據實際情況修改
    for i in range(6,12):
      for j in range(1,6):
        sheet.write(i,j,'',style_heading)

接下來是寫入表頭

# 寫入文件標題
    sheet.write(0,0,'標題',style_heading)
    sheet.write(0,4,'故障等級',style_heading)
    sheet.write(1,0,'開始時間',style_heading)
    sheet.write(1,2,'結束時間',style_heading)
    sheet.write(1,4,'持續時間',style_heading)
    sheet.write(2,0,'影響描述',style_heading)
    ...

接下來是定義表格的寬度和高度

sheet.col(0).width = 3333
    sheet.col(1).width = 6666
    ...
    sheet.row(0).height_mismatch = True # 高度可不依賴字體大小定義,定義高度時最好開啟此選項
    sheet.row(0).height = 40*20
    ...
    for i in range(7,12): # 也可以通過for循環批量定義高度或寬度
      sheet.row(i).height_mismatch = True
      sheet.row(i).height = 40*20

接下來是寫入數據

#寫入數據
    for i in Case_Study.objects.all().filter(a_name = filenames): # 查詢要寫入的數據
      sheet.write(0,1,i.a_name,style_playback)
      sheet.write(0,5,i.b_level,style_heading)
      sheet.write(1,1,i.d_starttime,style_time)
      sheet.write(1,3,i.e_endttime,style_time)
      ...

最后是寫出道IO并返回

# 寫出到IO
    output = BytesIO()
    wb.save(output)
    # 重新定位到開始
    output.seek(0)
    response.write(output.getvalue())
    return response
    
  export_excel.short_description = "導出Excel文件"

admin.site.register(test,testAdmin)

關于“django中admin后臺如何實現添加導出excel功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文山县| 甘孜县| 淮北市| 花莲市| 富蕴县| 娄底市| 衡水市| 宾川县| 无锡市| 贵州省| 南昌市| 富顺县| 克什克腾旗| 郎溪县| 大渡口区| 安国市| 乌兰浩特市| 凤冈县| 邯郸县| 万安县| 南宁市| 阳谷县| 龙岩市| 顺昌县| 沁水县| 满洲里市| 外汇| 华坪县| 惠东县| 吉林省| 论坛| 临颍县| 闻喜县| 马山县| 鹤岗市| 武威市| 东阳市| 大港区| 即墨市| 河西区| 巢湖市|