zoukankan      html  css  js  c++  java
  • 通过python中xlrd读取excel表格(xlwt写入excel),xlsxwriter写入excel表格并绘制图形

     1 import xlrd, xlwt
     2 
     3 #读取excel文件
     4 def read_excel(url):#传入源文件读取路径
     5     # 获取数据
     6     data = xlrd.open_workbook(url)
     7     # 获取sheet
     8     # table = data.sheet_by_name(sheet_name) #通过sheet名称获取sheet数据
     9     table = data.sheet_by_index(0) #通过sheet索引获取sheet数据
    10     # 获取总行数
    11     nrows = table.nrows
    12     # 获取总列数
    13     ncols = table.ncols
    14     # 获取一个单元格的数值
    15     cell_value = table.cell(0, 1).value #获取第0行第1列的值,即 B1 的值
    16     print(cell_value)
    17     
    18 #写入excel文件
    19 def write_excel(url, sheet_name, data): #传入文件存储路径、excel的sheet名称、以及要插入的数据
    20     #data = (('biqi', 963, 177), ('editor_Intern1', 912, 154), ('editor_Intern10', 840, 163), ('editor_Intern11', 644, 173)) #模板数据
    21     myWorkbook = xlwt.Workbook() #创建excel
    22     mySheet = myWorkbook.add_sheet(sheet_name) #创建excel中的sheet
    23     for i, val in enumerate(data):
    24         for j, value in enumerate(val):
    25             mySheet.write(i, j, value) #遍历数据插入sheet中
    26     myWorkbook.save(url) #将创建的excel保存在该路径下
      1 import xlsxwriter
      2 
      3 #写入excel文件
      4 def write_excel(url): #传入excel存储路径
      5     #将要插入excel并用作绘图的数据
      6     data_all = {'错误汇总': {
      7         'error_summary_header': ['账号', '姓名', '投资评级错误', '评级变化错误', '股票代码错误', '股票名称错误', '目标价错误', '目标价高错误', '净利润错误',
      8                                  '归母净利润错误', '年份错误', '分析师名字错误', '邮箱错误', '证券职业编码错误', '电话错误', '记录错误数', '错误数(人工)',
      9                                  '错误数(研报本身)', '错误数(抽查)', '总记录数', '错误率', '研报总数'],
     10         'editor_Intern1': ['editor_Intern1', 'editor_Intern1', 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 912, '0.22%',
     11                            223],
     12         'editor_Intern10': ['editor_Intern10', 'editor_Intern10', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 837, '0.12%',
     13                             232],
     14         'editor_Intern11': ['editor_Intern11', 'editor_Intern11', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 644, '0.16%',
     15                             173],
     16         'editor_Intern12': ['editor_Intern12', 'editor_Intern12', 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 439, '0.23%',
     17                             99],
     18         'editor_Intern2': ['editor_Intern2', 'editor_Intern2', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1132, '0.0%',
     19                            265],
     20         'editor_Intern3': ['editor_Intern3', 'editor_Intern3', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 852, '0.0%', 280],
     21         'editor_Intern4': ['editor_Intern4', 'editor_Intern4', 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1002, '0.7%',
     22                            297],
     23         'editor_Intern5': ['editor_Intern5', 'editor_Intern5', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, '0.0%',
     24                            213],
     25         'editor_Intern6': ['editor_Intern6', 'editor_Intern6', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778, '0.0%',
     26                            200],
     27         'editor_Intern8': ['editor_Intern8', 'editor_Intern8', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     28         'editor_Intern9': ['editor_Intern9', 'editor_Intern9', 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 762, '0.66%', -3],
     29         'editor_Intern13': ['editor_Intern13', 'editor_Intern13', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, '0.0%',
     30                             180],
     31         'editor_Intern14': ['editor_Intern14', 'editor_Intern14', 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 0, 10, 0, 0, 0, 467, '2.14%',
     32                             102],
     33         'Total': ['Total', '合计', 0, 0, 0, 0, 0, 0, 12, 3, 9, 0, 4, 0, 0, 28, 0, 0, 0, 10102, '0.28%', 2595]}}
     34     # 数据表头
     35     error_detail_header = ['研报_id', '账号', '投资评级错误', '评级变化错误', '股票代码错误', '股票名称错误', '目标价错误', '目标价高错误', '净利润错误', '归母净利润错误',
     36                            '年份错误', '分析师名字错误', '邮箱错误', '证券职业编码错误', '电话错误']
     37     #创建excel
     38     myWorkbook = xlsxwriter.Workbook(url)
     39     # 自定义样式
     40     bold = myWorkbook.add_format({
     41         'font_size': 10,  # 字体大小
     42         'bold': True,  # 是否粗体
     43         'bg_color': '#101010',  # 表格背景颜色
     44         'font_color': '#FEFEFE',  # 字体颜色
     45         'align': 'center',  # 居中对齐
     46         'top': 2,  # 上边框
     47         'left': 2,  # 左边框
     48         'right': 2,  # 右边框
     49         'bottom': 2  # 底边框
     50     })
     51     for k, v in data_all.items():
     52         if k == '错误明细':
     53             mySheet1 = myWorkbook.add_worksheet(k) #创建“错误明细”sheet
     54             for index, header in enumerate(error_detail_header):
     55                 mySheet1.write(0, index, header, bold)
     56             for i, val in enumerate(v):
     57                 i += 1
     58                 for j, value in enumerate(val):
     59                     mySheet1.write(i, j, value, bold) #向第i行第j列插入数据,并使用bold定义的样式
     60         if k == '错误汇总':
     61             mySheet2 = myWorkbook.add_worksheet(k)
     62             i = 0
     63             for summary_value in v.values():
     64                 for sum_index, sum_value in enumerate(summary_value):
     65                     mySheet2.write(i, sum_index, sum_value, bold)
     66                 i += 1
     67 
     68     '''绘制错误数柱状图'''
     69     # 创建一个柱状图(column chart)
     70     chart_col = myWorkbook.add_chart({'type': 'column'})
     71 
     72     # 图表下方显示数据表格
     73     chart_col.set_table({
     74         'show_keys': True
     75     })
     76 
     77     # 配置数据(用了另一种语法)
     78     chart_col.add_series({
     79         'name': '=错误汇总!$P$1',
     80         'categories': '=错误汇总!$B$2:$B$14',
     81         'values': '=错误汇总!$P$2:$P$14',
     82         'line': {'color': '#C0504D'},
     83         'fill': {'color': '#C0504D'},
     84         'data_labels': {'value': True}, #在图表上显示对应的数据
     85     })
     86 
     87     # # 配置数据
     88     # chart_col.add_series({
     89     #     'name': ['错误汇总', 0, 2],
     90     #     'categories': ['错误汇总', 1, 0, 6, 0],
     91     #     'values': ['错误汇总', 1, 2, 6, 2],
     92     #     'line': {'color': 'red'},
     93     # })
     94 
     95     # 设置图表的title 和 x,y轴信息
     96     chart_col.set_title({'name': '记录错误数'})
     97     chart_col.set_x_axis({'name': '员工'})
     98     chart_col.set_y_axis({'name': '错误数'})
     99 
    100     # 设置图表的风格
    101     chart_col.set_style(10)
    102 
    103     # 把图表插入到worksheet以及偏移
    104     mySheet2.insert_chart('A21', chart_col, {
    105         'x_offset': 0,
    106         'y_offset': 0,
    107         'x_scale':  1.5,
    108         'y_scale':  1.5,
    109     }) #第一个参数为图表插入的起始位置, x_offset、y_offset为偏移量, x_scale、y_scale为缩放比率
    110 
    111     '''绘制错误率折线图'''
    112     chart_col1 = myWorkbook.add_chart({'type': 'line'})
    113     # 配置数据(用了另一种语法)
    114     chart_col1.add_series({
    115         'name': '=错误汇总!$U$1',
    116         'categories': '=错误汇总!$B$2:$B$14',
    117         'values': '=错误汇总!$U$2:$U$14',
    118         'line': {'color': '#C0504D'},
    119         'data_labels': {'value': True},
    120     })
    121 
    122     # # 配置数据
    123     # chart_col1.add_series({
    124     #     'name': ['错误汇总', 0, 2],
    125     #     'categories': ['错误汇总', 1, 0, 6, 0],
    126     #     'values': ['错误汇总', 1, 2, 6, 2],
    127     #     'line': {'color': 'red'},
    128     # })
    129 
    130     # 设置图表的title 和 x,y轴信息
    131     chart_col1.set_title({'name': '错误率'})
    132     chart_col1.set_x_axis({'name': '员工'})
    133     chart_col1.set_y_axis({'name': '错误数'})
    134 
    135     # 设置图表的风格
    136     chart_col1.set_style(1)
    137 
    138     # 将柱状图合并入折线图中
    139     # chart_col1.combine(chart_col)
    140 
    141     mySheet2.insert_chart('N21', chart_col1, {
    142         'x_offset': 0,
    143         'y_offset': 0,
    144         'x_scale': 1.5,
    145         'y_scale': 1.5,
    146     }) #第一个参数为图表插入的起始位置, x_offset、y_offset为偏移量, x_scale、y_scale为缩放比率
    147 
    148     '''绘制错误种类饼图'''
    149     # 创建一个柱状图(column chart)
    150     chart_col2 = myWorkbook.add_chart({'type': 'pie'})
    151     # 配置数据(用了另一种语法)
    152     chart_col2.add_series({
    153         'categories': '=错误汇总!$C$1:$O$1',
    154         'values': '=错误汇总!$C$15:$O$15',
    155         'data_labels': {'value': True},
    156         'points': [
    157             {'fill': {'color': '#4590A7'}},
    158             {'fill': {'color': '#AA4643'}},
    159             {'fill': {'color': '#89A54E'}},
    160             {'fill': {'color': '#71588F'}},
    161             {'fill': {'color': '#4198AF'}},
    162             {'fill': {'color': '#DB843D'}},
    163             {'fill': {'color': '#93A9CF'}},
    164             {'fill': {'color': '#D19392'}},
    165             {'fill': {'color': '#B9CD96'}},
    166             {'fill': {'color': '#4590A7'}},
    167             {'fill': {'color': '#AA4643'}},
    168             {'fill': {'color': '#89A54E'}},
    169             {'fill': {'color': '#71588F'}},
    170             {'fill': {'color': '#4198AF'}},
    171             {'fill': {'color': '#DB843D'}},
    172             {'fill': {'color': '#93A9CF'}},
    173             {'fill': {'color': '#D19392'}},
    174             {'fill': {'color': '#B9CD96'}},
    175         ] #饼状图会使用到的色号
    176     })
    177 
    178     # # 配置数据
    179     # chart_col.add_series({
    180     #     'name': ['错误汇总', 0, 2],
    181     #     'categories': ['错误汇总', 1, 0, 6, 0],
    182     #     'values': ['错误汇总', 1, 2, 6, 2],
    183     #     'line': {'color': 'red'},
    184     # })
    185 
    186     # 设置图表的title
    187     chart_col2.set_title({'name': '错误种类占比'})
    188 
    189     # 设置图表的风格
    190     chart_col2.set_style(1)
    191 
    192     # 把图表插入到worksheet以及偏移
    193     mySheet2.insert_chart('H45', chart_col2, {
    194         'x_offset': 0,
    195         'y_offset': 0,
    196         'x_scale': 1.5,
    197         'y_scale': 1.5,
    198     }) #第一个参数为图表插入的起始位置, x_offset、y_offset为偏移量, x_scale、y_scale为缩放比率
    199 
    200     myWorkbook.close()
    201 
    202 if __name__ == '__main__':
    203     write_excel('./datasource/test_query_bak.xls')

     总体来说,如果只需要从excel读取数据及向excel中插入数据,用xlrd包及xlwt包就可以很好的解决了;但如果想要在excel中绘制各种报表图片就需要借助xlsxwriter包来进行了(xlsxwriter官网:http://xlsxwriter.readthedocs.io/chart.html)

    附上xlsxwriter绘制的图表的截图

  • 相关阅读:
    jsp和servlet的联系与区别
    tomcat会如何处理请求
    java中synchronized的关键字
    mybatis的动态sql
    spring自带的json转换工具,支持@ResponseBody注解
    layer一个web弹窗/层解决方案
    spring mvc出现乱码的问题
    hdu1010 Tempter of the Bone
    hdu 3342 Legal or Not
    ThreadPoolExecutor线程池执行器源码解析
  • 原文地址:https://www.cnblogs.com/Goongo/p/9383138.html
Copyright © 2011-2022 走看看