Python處理Excel數(shù)據(jù)可視化

關(guān)鍵技術(shù)

  • FE
  • Ajax
  • Flask
  • Echarts
  • xlrd

FE 部分

此部分為基礎(chǔ)前端知識內(nèi)容肺然,根據(jù)業(yè)務(wù)所需,自行進(jìn)行頁面布局蹂随。

Ajax 部分

此部分是能來進(jìn)行數(shù)據(jù)請求與異步加載

Flask部分

此部分主要是為其搭建web服務(wù),F(xiàn)lask相對django更輕量悠抹,也可替換為Django框架

Echarts部分

此部分主要是對接收到的數(shù)據(jù)來進(jìn)行可視化展示

xlrd部分

此部分是使用Python語言處理excel的主要模塊,用來讀取業(yè)務(wù)數(shù)據(jù)

邏輯圖

開發(fā)邏輯圖

效果圖

最終效果圖

代碼詳解

首先參考Echarts官方文檔,查看相關(guān)API調(diào)用方法

<div id="main" style="width:1600px;height:1600px;"></div>
<script type="text/javascript">
     var myChart = echarts.init(document.getElementById('main'));
     var option = {
                            title: {
                            text: '數(shù)據(jù)統(tǒng)計(jì)可視化'
                            },
                            tooltip: {},
                            grid:{
                                 height:'50%',
                                 width:'80%'
                            },
                            legend: {
                                data:['收入']
                            },
                            xAxis: {/*x軸*/
                                axisLabel:{
                                    rotate:45
                                },
                                data: []
                            },
                            yAxis: {},/*y軸*/
                            series: [{
                                name: '收入',
                                type: 'bar',
                                barwidth:10,
                                data: []
                            }]
                        };                                             
                        myChart.setOption(option);                        
                    }
                }
            }                      
    </script>

其中Echarts需要首先進(jìn)行引進(jìn) 可以使用本地引進(jìn),也可使用CDN

<script src="https://cdn.bootcdn.net/ajax/libs/echarts/2.1.10/echarts-all.js"></script>

其次氯窍,使用xlrd模塊對Excel文件進(jìn)行數(shù)據(jù)讀取饲常,并轉(zhuǎn)存為Json格式,記為data_show.py

import xlrd
import json

def ReadFile(user,userinfo):
    excel = xlrd.open_workbook("test.xlsx")  # Open the file of excel
    target_sheet = excel.sheet_by_index(0) # Get Sheets name By index /By Name of user's input string
    for i in range(2,target_sheet.nrows):
        if target_sheet.cell(i,11).value.split(' ')[0] not in user:
            user.append(target_sheet.cell(i,11).value.split(' ')[0])
    for k in user:
        userinfo[k] = 0
    for i in range(2,target_sheet.nrows):
        checkUsername(target_sheet.cell(i,11).value.split(' ')[0],target_sheet.cell(i,9).value,userinfo )
def checkUsername(name,num,userinfo):
    for k in userinfo:
        if name in k:
            userinfo[k] += int(num)
def Result(a=0):   
    userlist = [] #存儲歸屬人(X坐標(biāo)數(shù)據(jù))
    userinfo = {} #存儲數(shù)據(jù)(Y坐標(biāo)數(shù)據(jù))
    ReadFile(userlist,userinfo)   
    jsondata = json.dumps(userinfo,ensure_ascii=False)
    return jsondata

其中Result為主要入口函數(shù)

接著,搭建Flask框架狼讨,存儲至hello.py

from flask import Flask,render_template,request,Response
import data_show #引入數(shù)據(jù)處理py文件
import json
app = Flask(__name__)

@app.route('/')
def index():
    return '''<!DOCTYPE html>.....'''  #此處為FE代碼
@app.route('/show',methods=['POST','GET'])  
def show_info():  
    if request.method == 'GET':
        num = request.args.get('a')
        Rejson = data_show.Result(num)
        return Response(Rejson,content_type="application/json")

if __name__ == '__main__':
    app.run(port=8888,debug=True)

通過Flask框架對數(shù)據(jù)進(jìn)行讀取,通過請求http://127.0.0.1:8888/show?a=來進(jìn)行響應(yīng),此處的a為以后業(yè)務(wù)擴(kuò)展使用柒竞,例如可以傳入關(guān)鍵參數(shù)政供,季度,月份等查詢

為了能夠動態(tài)加載相關(guān)內(nèi)容并且不影響整個頁面的使用朽基,友好性來進(jìn)行處理布隔,可以使用Ajax技術(shù)來進(jìn)行動態(tài)異步請求

    let xhr; 
    if (window.XMLHttpRequest)
    {
       xhr = new XMLHttpRequest()
    }
    else
    {
       xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhr.open("GET","http://127.0.0.1:8888/show?a=1",true);
    xhr.send();
    xhr.onreadystatechange = function(){
        if(xhr.readyState==4 && xhr.status==200){
              //EchartsAPI相關(guān)代碼
              let info = JSON.parse(xhr.responseText) //處理通過Flask響應(yīng)的函數(shù)Json數(shù)據(jù)
              let user = []
              let user_info = []
              for (var name in info){
                  user.push(name);
                  user_info.push(info[name]);
              }   
              option.xAxis.data = user; 
              option.series[0].data = user_info;
         }
    }

后記

代碼核心主要分為Echarts的API調(diào)用,Ajax的Json數(shù)據(jù)請求與處理稼虎,F(xiàn)lask框架衅檀,xlrd模塊的Excel數(shù)據(jù)讀取與處理。

代碼可以優(yōu)化有以下內(nèi)容:

  1. 在Flask框架的使用可以使用temple霎俩,static等來使用模板文件和靜態(tài)文件來進(jìn)行處理哀军。
  2. 在調(diào)用Echart數(shù)據(jù)時可以在未完成數(shù)據(jù)繪制前,加入loading方法打却,來提升友好性杉适。
  3. 后期可結(jié)合數(shù)據(jù)庫進(jìn)行操作,并且對功能可以進(jìn)行篩選擴(kuò)展

參考資料

  1. CSDN:python通過flask和前端進(jìn)行數(shù)據(jù)收發(fā)
  2. CSDN:echarts讀取本地json文件
  3. CSDN:使用echart從后臺獲取數(shù)據(jù)動態(tài)顯示到頁面
  4. CSDN:python封裝JSON前后端解析
  5. Penguin私人博客:Flask設(shè)置返回json格式數(shù)據(jù)

官方文件/文檔/資料

  1. Echarts官方資料: https://echarts.apache.org/zh/tutorial.html
  2. Echarts CDN:https://cdn.bootcdn.net/ajax/libs/echarts/2.1.10/echarts-all.js
  3. Ajax教程:https://www.w3cschool.cn/ajax/
  4. Flask教程:https://www.w3cschool.cn/flask/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柳击,一起剝皮案震驚了整個濱河市猿推,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌肴,老刑警劉巖蹬叭,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異状知,居然都是意外死亡秽五,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門试幽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筝蚕,“玉大人,你說我怎么就攤上這事铺坞∑鹂恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵济榨,是天一觀的道長坯沪。 經(jīng)常有香客問我,道長擒滑,這世上最難降的妖魔是什么腐晾? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任叉弦,我火速辦了婚禮,結(jié)果婚禮上藻糖,老公的妹妹穿的比我還像新娘淹冰。我一直安慰自己,他們只是感情好巨柒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布樱拴。 她就那樣靜靜地躺著,像睡著了一般洋满。 火紅的嫁衣襯著肌膚如雪晶乔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天牺勾,我揣著相機(jī)與錄音正罢,去河邊找鬼。 笑死驻民,一個胖子當(dāng)著我的面吹牛翻具,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播川无,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呛占,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了懦趋?” 一聲冷哼從身側(cè)響起晾虑,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仅叫,沒想到半個月后帜篇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诫咱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年笙隙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坎缭。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡竟痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掏呼,到底是詐尸還是另有隱情坏快,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布憎夷,位于F島的核電站莽鸿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祥得,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一兔沃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧级及,春花似錦乒疏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至追驴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疏之,已是汗流浹背殿雪。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锋爪,地道東北人丙曙。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像其骄,于是被迫代替她去往敵國和親亏镰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355