前面介绍了pandas的简单用法,pandas的数据可以通过matlab第三方包将数据生成报表,但是我想将报表生成在Excel中,这时候就可以借助xlsxwriter第三方包来生成图标
 
缺点:xlsxwriter不能对已存在的Excel进行编辑插入图标
 
这里的生成excel主要分为准备多维数组类型的数据->数据插入到Excel中->对数据按系列划分生成报表 

第一步:处理数据

从pandas中得到的数据是DataFrame格式的,类似下面的字典结构,我们需要将他转换成多维数组格式,多维数组的第一个数组为所有标题,第二个数组为标题下第一行数据...
  1. bugnum_terminal = {
  2. "Android的BUG数": [bugnum_android],
  3. "iOS的BUG数": [bugnum_ios],
  4. "server的BUG数": [bugnum_server],
  5. "FE的BUG数": [bugnum_fe]
  6. }
 
处理方法:
# 将字典型的数据转换成数组,可使用columns指定key的排序,例如{"A":[1,2,3,4],"B":[5,6,7,8]}会转换成[["A","B"],[1,5],[2,6],[3,7],[4,8]]
  1. def parsedata(self, dictdata, columns=[]):
  2. result = []
  3. if columns == []:
  4. keys = dictdata.keys()
  5. else:
  6. keys = columns
  7. result.append([key for key in keys])
  8. values = []
  9. for key in keys:
  10. values.append(dictdata[key])
  11.  
  12. values = zip(*values)
  13. for value in values:
  14. result.append(list(value))
  15. return result
 
这样返回的数据就是一个可直接插入Excel中的多维数组

第二步:将数据插入Excel中

首先要创建一个Excel文件,然后在Excel中创建一个sheet表单页,最后将数据插入到sheet表单页中
1、创建一个Excel对象
  1. workbook = xlsxwriter.Workbook(“Excel名字.xlsx”)
 
2、基于Excel对象创建一个sheet表单对象
  1. worksheet = workbook.add_worksheet(name=“sheet表单的名字,不填写就默认为sheet1")
3、将数据写入sheet表单页worksheet
  1. worksheet.write_row( row, col, data, cell_format=None)
  2. worksheet.write_column(row, col, data, cell_format=None)
 
可以用A1表示第一行第一列的那个单元格,这个时候后面的data可以是个数组,直接插入一行数据
  1. worksheet.write_row("A1", 一行数据, 样式(非必填项))
cell_format为表单样式:例如加粗
  1. bold = workbook.add_format({'bold': 1})
将数据插入表单的例子:
  1. for row in range(len(data)): # 将数据插入excel中
  2. if row == 0:
  3. print(data[row])
  4. worksheet.write_row("A" + str(row+1), data[row], bold)
  5. worksheet.write_column()
  6. else:
  7. 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]
  1. chart.add_series({
  2. 'categories': '=Sheet1!$A$1:$A$5',
  3. 'values': '=Sheet1!$B$1:$B$5',
  4. 'line': {'color': 'red’},
  5. 'name':'=各端BUG数汇总_图表!$A$3'
  6. })
 
# 第二种添加方式:[sheetname, first_row, first_col, last_row, last_col]
  1. chart.add_series({
  2. 'categories': ['Sheet1', 0, 0, 4, 0],
  3. 'values': ['Sheet1', 0, 1, 4, 1],
  4. 'line': {'color': 'red'},
  5. 'name':['Sheet1', 0, 0],
  6. 'data_labels': {'value': True}
  7. })
 
categories为图表下面的分组名称
values:必填项,要统计的图标数据
name:系列的名字
data_labels:显示在图表上的数据标签
 
一个图表可以添加多个系列,可以通过两种方式添加多个系列
a、调用多次add_series()方法
b、add_series()中categories和values多个值用元组记录
  1. chart.add_series({
  2. 'categories': '=(Sheet1!$A$1:$A$9,Sheet1!$A$14:$A$25)',
  3. 'values': '=(Sheet1!$B$1:$B$9,Sheet1!$B$14:$B$25)',
  4. })
 
3、给图表定义名字和样式
  1. chart.set_title({'name': ‘图标名字'})
  2. chart.set_style(10)
  3. chart.height=600
  4. chart.width=960
height和width为生成的图标的宽高,默认宽高为480和288
 
4、将图表插入到Excel中
a:方法1
  1. worksheet.insert_chart('A7', chart)方法插入数据
b:方法2
  1. chartsheet = workbook.add_chartsheet()
  2. chartsheet.set_chart(chart)
 
例子:
  1. chart = workbook.add_chart({'type': 'column'})
  2. chart.add_series({
  3.  
  4. 'categories': '=各端BUG数汇总_图表!$A$1:$' + dataarray.getrowname_end() + '$1',
  5. 'values': '=各端BUG数汇总_图表!$A$2:$' + dataarray.getrowname_end() + '$2',
  6. 'name':'=各端BUG数汇总_图表!$A$3'
  7.  
  8. })
  9.  
  10. chart.set_title({'name': '各端BUG数汇总'})
  11. chart.set_style(10)
  12.  
  13. 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方法合并
  1. column_chart = workbook.add_chart({'type': 'column'})
  2.  
  3. column_chart.add_series({
  4. 'name': '=Sheet1!B1',
  5. 'categories': '=Sheet1!A2:A7',
  6. 'values': '=Sheet1!B2:B7',
  7. })
  8.  
  9. line_chart = workbook.add_chart({'type': 'line'})
  10.  
  11. line_chart.add_series({
  12. 'name': '=Sheet1!C1',
  13. 'categories': '=Sheet1!A2:A7',
  14. 'values': '=Sheet1!C2:C7',
  15. })
  16.  
  17. column_chart.combine(line_chart)
 
注意:合并之前chart一定要添加了series才行,可以通过len(chart.series)判断是否为空(长度为0则为空)
在这过程中遇到一个问题,合并多个column的chart时,只保留了第一个和最后一个chart的值,这个如果还没找到好办法
 
(其他)图表操作2:添加table
  1. 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. 学习excel的使用技巧一空格替换为0

    问题1  把excel表格中的空格  填充为0 方法1 选中CDE列    CRTL+F 查找空 替换为0 方法2 选中CDE列 CRTL+G 打开定位  点击条件定位  选择空值 点击确定  然后在 ...

  2. 30.Scrapy 对接 Selenium

    Scrapy 对接 Selenium(参考代码网址,https://github.com/Python3WebSpider/ScrapySeleniumTest) 此文就是参考书上的代码拿下来跑,作为 ...

  3. EA Data Modeling 显示别名设置

    1.设置 2.效果 

  4. GPUImage中亮度调整的实现——GPUImageBrightnessFilter

    亮度brightness其实是对RGB的调整,RGB值越大,效果越亮:反之则越暗. GPUImage中提供了对图像亮度调整的Filter,其核心代码如下(fragment): varying high ...

  5. 2018年1月21日--2月4日 NAS

    二十号去比赛时,与同事闲聊时说起家庭服务器,后来搜到nas(网络附着存储器),找到freenas,突然觉得很有用,手机拍了大量的照片视频,存储在电脑,已经换过几次硬盘了,对于这些珍贵的资料,万一硬盘坏 ...

  6. linux 下使用 curl post

    命令: curl -X POST -d @/etc/lazada/lazada_tracking.txt   http://localhost:8080/booking/rs/LazadaServic ...

  7. leetcode993

    public class Node { public int CurNode; public int FatherNode; public int Layer; } public class Solu ...

  8. Appium-We wanted {"required":["value"]} and you sent ["text","sessionId","id","value"]

    APK 链接:https://pan.baidu.com/s/17oeTM1qA0QjPBqLh6pS0Yg 提取码:s9ru # coding:utf-8from appium import web ...

  9. django日志配置

    直接参考这篇,很详细:https://www.cnblogs.com/changqing8023/p/9639769.html 补充一点:日志文件打开时,中文乱码,要在handler中设置编码格式,' ...

  10. element el-upload组件获取文件名

    组件的连接:http://element-cn.eleme.io/#/zh-CN/component/upload 需求:点x按钮,获取文件名传到后端服务,把文件从服务器删除 分析: 仔细看文档,会发 ...