前面介绍了pandas的简单用法,pandas的数据能够经过matlab第三方包将数据生成报表,可是我想将报表生成在Excel中,这时候就能够借助xlsxwriter第三方包来生成图标
缺点:xlsxwriter不能对已存在的Excel进行编辑插入图标
这里的生成excel主要分为准备多维数组类型的数据->数据插入到Excel中->对数据按系列划分生成报表
第一步:处理数据
从pandas中获得的数据是DataFrame格式的,相似下面的字典结构,咱们须要将他转换成多维数组格式,多维数组的第一个数组为全部标题,第二个数组为标题下第一行数据...
bugnum_terminal = {
"Android的BUG数": [bugnum_android],
"iOS的BUG数": [bugnum_ios],
"server的BUG数": [bugnum_server],
"FE的BUG数": [bugnum_fe]
}
处理方法:
# 将字典型的数据转换成数组,可以使用columns指定key的排序,例如{"A":[1,2,3,4],"B":[5,6,7,8]}会转换成[["A","B"],[1,5],[2,6],[3,7],[4,8]]
def parsedata(self, dictdata, columns=[]):
result = []
if columns == []:
keys = dictdata.keys()
else:
keys = columns
result.append([key for key in keys])
values = []
for key in keys:
values.append(dictdata[key])
values = zip(*values)
for value in values:
result.append(list(value))
return result
这样返回的数据就是一个可直接插入Excel中的多维数组
第二步:将数据插入Excel中
首先要建立一个Excel文件,而后在Excel中建立一个sheet表单页,最后将数据插入到sheet表单页中
一、建立一个Excel对象
workbook = xlsxwriter.Workbook(“Excel名字.xlsx”)
二、基于Excel对象建立一个sheet表单对象
worksheet = workbook.add_worksheet(name=“sheet表单的名字,不填写就默认为sheet1")
三、将数据写入sheet表单页worksheet
worksheet.write_row( row, col, data, cell_format=None)
worksheet.write_column(row, col, data, cell_format=None)
能够用A1表示第一行第一列的那个单元格,这个时候后面的data能够是个数组,直接插入一行数据
worksheet.write_row("A1", 一行数据, 样式(非必填项))
cell_format为表单样式:例如加粗
bold = workbook.add_format({'bold': 1})
将数据插入表单的例子:
for row in range(len(data)): # 将数据插入excel中
if row == 0:
print(data[row])
worksheet.write_row("A" + str(row+1), data[row], bold)
worksheet.write_column()
else:
worksheet.write_row("A" + str(row+1), data[row])
说明:data为第一步生成的多维数组数据,write_row这里是经过Excel的A一、A2....等方式标识单元格的
第三步:生成图表
一、经过add_chart({’type’:’表格类型’})添加一个chart对象
经过type定义图标的类型,好比是柱形图仍是饼图
The supported chart types are:
- area: Creates an Area (filled line) style chart.
- bar: Creates a Bar style (transposed histogram) chart.
- column: Creates a column style (histogram) chart.
- line: Creates a Line style chart.
- pie: Creates a Pie style chart.
- doughnut: Creates a Doughnut style chart.
- scatter: Creates a Scatter style chart.
- stock: Creates a Stock style chart.
- radar: Creates a Radar style chart.
二、添加图标要统计的数据,同一个报表能够添加多个系列
# 第一种添加方式:[sheetname, A1(起始单元格标识), F1(结束单元格标识), last_col]
chart.add_series({
'categories': '=Sheet1!$A$1:$A$5',
'values': '=Sheet1!$B$1:$B$5',
'line': {'color': 'red’},
'name':'=各端BUG数汇总_图表!$A$3'
})
# 第二种添加方式:[sheetname, first_row, first_col, last_row, last_col]
chart.add_series({
'categories': ['Sheet1', 0, 0, 4, 0],
'values': ['Sheet1', 0, 1, 4, 1],
'line': {'color': 'red'},
'name':['Sheet1', 0, 0],
'data_labels': {'value': True}
})
categories为图表下面的分组名称
values:必填项,要统计的图标数据
name:系列的名字
data_labels:显示在图表上的数据标签
一个图表能够添加多个系列,能够经过两种方式添加多个系列
a、调用屡次add_series()方法
b、add_series()中categories和values多个值用元组记录
chart.add_series({
'categories': '=(Sheet1!$A$1:$A$9,Sheet1!$A$14:$A$25)',
'values': '=(Sheet1!$B$1:$B$9,Sheet1!$B$14:$B$25)',
})
三、给图表定义名字和样式
chart.set_title({'name': ‘图标名字'})
chart.set_style(10)
chart.height=600
chart.width=960
height和width为生成的图标的宽高,默认宽高为480和288
四、将图表插入到Excel中
a:方法1
worksheet.insert_chart('A7', chart)方法插入数据
b:方法2
chartsheet = workbook.add_chartsheet()
chartsheet.set_chart(chart)
例子:
chart = workbook.add_chart({'type': 'column'})
chart.add_series({
'categories': '=各端BUG数汇总_图表!$A$1:$' + dataarray.getrowname_end() + '$1',
'values': '=各端BUG数汇总_图表!$A$2:$' + dataarray.getrowname_end() + '$2',
'name':'=各端BUG数汇总_图表!$A$3'
})
chart.set_title({'name': '各端BUG数汇总'})
chart.set_style(10)
worksheet.insert_chart('B10', chart)
最终生成的1个柱形图以下:
A:chart.set_title({'name': ‘图标名字’})
B:chart.add_series()中的name
C:chart.add_series()中的categories
D:chart.add_series()中的values
(其余)图表操做1:合并多个series系列到一块儿
多个系列正常是紧挨着在一块儿的,可是有时候咱们想合并到一块儿,例如柱形图或折线图放到一块儿,这时候就能够用chart的combine方法合并
column_chart = workbook.add_chart({'type': 'column'})
column_chart.add_series({
'name': '=Sheet1!B1',
'categories': '=Sheet1!A2:A7',
'values': '=Sheet1!B2:B7',
})
line_chart = workbook.add_chart({'type': 'line'})
line_chart.add_series({
'name': '=Sheet1!C1',
'categories': '=Sheet1!A2:A7',
'values': '=Sheet1!C2:C7',
})
column_chart.combine(line_chart)
注意:合并以前chart必定要添加了series才行,能够经过len(chart.series)判断是否为空(长度为0则为空)
在这过程当中遇到一个问题,合并多个column的chart时,只保留了第一个和最后一个chart的值,这个若是还没找到好办法
(其余)图表操做2:添加table
column_chart.set_table({'show_keys': True})
此时会在图下面列出没系列的值,显示成table的样式
图表操做1和操做2的结合样式以下: