python根据excel生成报表_python生成Excel图表(通过xlsxwriter)

前面介绍了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([keyfor key inkeys])

values=[]for key inkeys:

values.append(dictdata[key])

values= zip(*values)for value invalues:

result.append(list(value))return result

这样返回的数据就是一个可直接插入Excel中的多维数组

第二步:将数据插入Excel中

首先要创建一个Excel文件,然后在Excel中创建一个sheet表单页,最后将数据插入到sheet表单页中

1、创建一个Excel对象

workbook = xlsxwriter.Workbook(“Excel名字.xlsx”)

2、基于Excel对象创建一个sheet表单对象

worksheet = workbook.add_worksheet(name=“sheet表单的名字,不填写就默认为sheet1")

3、将数据写入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的A1、A2....等方式标识单元格的

第三步:生成图表

1、通过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.

2、添加图标要统计的数据,同一个报表可以添加多个系列

# 第一种添加方式:[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)',

})

3、给图表定义名字和样式

chart.set_title({'name': ‘图标名字'})

chart.set_style(10)

chart.height=600chart.width=960

height和width为生成的图标的宽高,默认宽高为480和288

4、将图表插入到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

626983-20180120155300631-1704265282.png

(其他)图表操作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的结合样式如下:

626983-20180120155359771-2058797181.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值