前面介绍了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表单页中
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=600
chart.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
 
(其他)图表操作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的结合样式如下:
 
 
 

python生成Excel图表(通过xlsxwriter)的更多相关文章

  1. JAVA生成EXCEL图表

    跟据客户的要求,需要开发一套包括图形的报表,还需要导出WORD 图表需要这样: 这样: 这样: 还有这样: 接下来是实现思路: 以往用的最多的就是JFreechart,手上也有实现各种图形的资源,但是 ...

  2. 使用poi和jfreechart生成excel图表图片

    最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...

  3. Python绘制Excel图表

    今天讲解下如何使用Python绘制各种Excel图表,下面我们以绘制饼状图.柱状图.水平图.气泡图.2D面积图.3D面积图为例来说明. import openpyxlfrom openpyxl imp ...

  4. python生成excel测试数据

    在功能测试时,经常会测到excel文件导入导出的功能,导入与导出时,需要测试系统单次导入大批量数据时是否正常, 如果系统承受不起太大的数据导入,则需要开发限制单次导入的数量,以防止系统服务异常.大量的 ...

  5. 小兴趣:用python生成excel格式座位表

    脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...

  6. 是用Epplus生成Excel 图表

    1.  前言 这是我最近项目刚要的需求,然后在网上找了半天的教材  但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...

  7. 使用Epplus生成Excel 图表

    1.  前言 这是我最近项目刚要的需求,然后在网上找了半天的教材  但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...

  8. python生成excel格式座位表

    脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...

  9. 【JAVA】POI生成EXCEL图表(柱状图、折线等)

    1.使用excel工具自带的图形工具创建一个图: 2.绑定数据区域: 3.数据区域绑定完成,我们要做的就是将数据写入到数据区域中: 4.标记 5.POI 引入包 <!-- https://mvn ...

随机推荐

  1. 代码:PC 链接列表面板border的一种做法(每行之间有分割线)

    PC 链接列表面板,border的一种做法 做页面经常遇到一种问题,上面是标题,下面是单行链接列表.为了保证后台套页面方便,所有列表项必须完全一样.但我们无法解决第一行或最后一行多出来的分割线. 使用 ...

  2. 白鹭引擎 - 文本类型 ( TextField, )

    1, 普通文本 class Main extends egret.DisplayObjectContainer { public constructor() { super(); this.addEv ...

  3. Linux上VNC常见命令

    参考链接: http://blog.csdn.net/russle/article/details/4757888 http://www.linuxidc.com/Linux/2016-06/1320 ...

  4. Swoole 进程管理

    用法: $process = new swoole_process(function(){ //这里写业务代码 },true) //开启进程,返回进程pid $pid = $process->s ...

  5. Centos代理上网设置

    原文链接:http://m.blog.csdn.net/article/details?id=51851677 一.centos自带界面设置代理 1. 界面设置  squid默认代理端口3128. 2 ...

  6. [转] golang socket

    server.go package main import ( "net" "fmt" "io/ioutil" "time&quo ...

  7. ubuntu防火墙命令初探

    1.防火墙的状态与开关 1)$sudo ufw status  //查看防火墙的状态及当前的设置规则 2)$sudo ufw enable //开启防火墙 3)$sudo ufw disable // ...

  8. 机器学习进阶-边缘检测-Canny边缘检测 1.cv2.Canny(进行Canny边缘检测)

    1. cv2.Canny(src, thresh1, thresh2) 进行canny边缘检测 参数说明: src表示输入的图片, thresh1表示最小阈值,thresh2表示最大阈值,用于进一步删 ...

  9. leetcode 题解 word search。递归可以更简洁。

    先写上我的代码: 我总是不知道何时把任务交给下一个递归.以致于,写出的代码很臃肿! 放上别人递归的简洁代码: bool exist(char** board, int m, int n, char* ...

  10. C++复习:对C的拓展

    简单的C++程序 求圆的周长和面积 数据描述:             半径,周长,面积均用实型数表示 数据处理:         输入半径 r:         计算周长 = 2*π*r :     ...