关键技术

FE

Ajax

Flask

Echarts

xlrd

FE 部分

此部分为基础前端知识内容,根据业务所需,自行进行页面布局。

Ajax 部分

此部分是能来进行数据请求与异步加载

Flask部分

此部分主要是为其搭建web服务,Flask相对django更轻量,也可替换为Django框架

Echarts部分

此部分主要是对接收到的数据来进行可视化展示

xlrd部分

此部分是使用Python语言处理excel的主要模块,用来读取业务数据

逻辑图

开发逻辑图

效果图

最终效果图

代码详解

首先参考Echarts官方文档,查看相关API调用方法



var myChart = echarts.init(document.getElementById('main'));
var option = {
title: {
text: '数据统计可视化'
},
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);
}
}
}

其中Echarts需要首先进行引进 可以使用本地引进,也可使用CDN

其次,使用xlrd模块对Excel文件进行数据读取,并转存为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坐标数据)
userinfo = {} #存储数据(Y坐标数据)
ReadFile(userlist,userinfo)
jsondata = json.dumps(userinfo,ensure_ascii=False)
return jsondata

其中Result为主要入口函数

接着,搭建Flask框架,存储至hello.py

from flask import Flask,render_template,request,Response
import data_show #引入数据处理py文件
import json
app = Flask(__name__)
@app.route('/')
def index():
return '''.....''' #此处为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框架对数据进行读取,通过请求http://127.0.0.1:8888/show?a=来进行响应,此处的a为以后业务扩展使用,例如可以传入关键参数,季度,月份等查询

为了能够动态加载相关内容并且不影响整个页面的使用,友好性来进行处理,可以使用Ajax技术来进行动态异步请求

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相关代码
let info = JSON.parse(xhr.responseText) //处理通过Flask响应的函数Json数据
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调用,Ajax的Json数据请求与处理,Flask框架,xlrd模块的Excel数据读取与处理。

代码可以优化有以下内容:

在Flask框架的使用可以使用temple,static等来使用模板文件和静态文件来进行处理。

在调用Echart数据时可以在未完成数据绘制前,加入loading方法,来提升友好性。

后期可结合数据库进行操作,并且对功能可以进行筛选扩展

参考资料

官方文件/文档/资料