zoukankan      html  css  js  c++  java
  • 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([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的结合样式如下:
     
     
     
  • 相关阅读:
    Node.js安装及环境配置之Windows篇
    盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug
    开源!一款功能强大的高性能二进制序列化器Bssom.Net
    开源 , KoobooJson一款高性能且轻量的JSON框架
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    .Net Web开发技术栈
    web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
    .Net高级进阶,教你如何构建企业模型数据拦截层,动态控制字段验证
    .Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)
    .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?
  • 原文地址:https://www.cnblogs.com/meitian/p/8320989.html
Copyright © 2011-2022 走看看