关键技术
- FE
- Ajax
- Flask
- Echarts
- xlrd
FE 部分
此部分为基础前端知识内容,根据业务所需,自行进行页面布局。
Ajax 部分
此部分是能来进行数据请求与异步加载
Flask部分
此部分主要是为其搭建web服务,Flask相对django更轻量,也可替换为Django框架
Echarts部分
此部分主要是对接收到的数据来进行可视化展示
xlrd部分
此部分是使用Python语言处理excel的主要模块,用来读取业务数据
逻辑图
效果图
代码详解
首先参考Echarts官方文档,查看相关API调用方法
<div id="main" style="width:1600px;height:1600px;"></div>
<script type="text/javascript">
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);
}
}
}
</script>
其中Echarts需要首先进行引进 可以使用本地引进,也可使用CDN
<script src="https://cdn.bootcdn.net/ajax/libs/echarts/2.1.10/echarts-all.js"></script>
其次,使用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 '''<!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框架对数据进行读取,通过请求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方法,来提升友好性。
- 后期可结合数据库进行操作,并且对功能可以进行筛选扩展
参考资料
- CSDN:python通过flask和前端进行数据收发
- CSDN:echarts读取本地json文件
- CSDN:使用echart从后台获取数据动态显示到页面
- CSDN:python封装JSON前后端解析
- Penguin私人博客:Flask设置返回json格式数据
官方文件/文档/资料
- Echarts官方资料: https://echarts.apache.org/zh/tutorial.html
- Echarts CDN:https://cdn.bootcdn.net/ajax/libs/echarts/2.1.10/echarts-all.js
- Ajax教程:https://www.w3cschool.cn/ajax/
- Flask教程:https://www.w3cschool.cn/flask/