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的结合样式如下:
     
     
     
  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/meitian/p/8320989.html
Copyright © 2011-2022 走看看