关键词搜索

源码搜索 ×
×

Python对excel的基本操作

发布2021-02-23浏览360次

详情内容

  1. 前言
    本文是通过Python的第三方库openpyxl, 该库根据官方介绍是支持Excel 2010 的 xlsx/xlsm/xltx/xltm格式文件,哪个版本的这些格式应该都可以支持。

作为网络攻城狮的我们,使用python对excel的基本操作技能就可以了,当然能够精通更好了。

那我们使用openpyxl有何作用?我是想后面跟大家分享一篇批量备份网络设备配置的文章,里面会涉及到对excel的操作,就提前给大家分享下如何操作基本的excel,顺便巩固下自己的知识。

来来来,先看下如下图所示,这是存放一张所有网络设备的管理地址表,通过python的openpyxl库就可以读取ip地址信息、巡检命令等信息,就可以批量去备份网络设备配置了,之前我都是用python结合txt文本的,觉得不太方便,就改成python结合excel的方式,excel编辑起来就非常方便了。

在这里插入图片描述

  1. 实验环境
    windown 10
    Python3.69
    Pycharm
    Python第三方库openpyxl
    excel 2013
    说明:各位实验环境请随意组合,python版本是3.x以上。

  2. 基本操作
    接下来就开始一步一步教大家如何操作…

3.1 安装openpyxl第三方库
首先,我们得先安装一下第三方库openpyxl,使用如下命令安装即可。
C:>pip install openpyxl
3.2 新建工作簿
3.2.1 新创建工作簿

from openpyxl import Workbook

# 类实例化
wb = Workbook()

# 保存并生成文件
wb.save('simple_excel.xlsx')

    ​ 说明:运行该代码后,会生成一份excel文件:simple_excel.xlsx,暂时没内容。

    3.2.2 缺省工作表

    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    # 激活并缺省创建第一个工作表:sheet
    ws1 = wb.active
    # 第一个工作表命名:1_sheet
    ws1.title = '1_sheet'
    # 保存并生成文件
    wb.save('simple_excel.xlsx')
    ​ 效果如下所示:
    
    
    
    3.2.3 创建工作表
    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    # 激活并缺省创建第一个工作表
    ws1 = wb.active
    # 第一个工作表命名
    ws1.title = '1_sheet'
    # 创建工作表3
    ws3 = wb.create_sheet(title='3_sheet', index=2)
    # 创建工作表2
    ws2 = wb.create_sheet('2_sheet', 1)
    # 创建工作表4
    ws4 = wb.copy_worksheet(ws3)
    # 保存并生成文件
    wb.save('simple_excel.xlsx')
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    ​ 参数说明:

    属性title:为工作表命名;
    方法create_sheet:创建新的工作表,其中index为工作表的顺序索引,如0表示第一张表…;
    方法copy_worksheet:复制工作表;
    方法save:保存并生成文件,每次运行都会覆盖同名文件;
    3.2.4 删除工作表

    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    # 激活并缺省创建第一个工作表
    
    # ...省略中间代码...
    
    ws4 = wb.copy_worksheet(ws3)
    
    # 删除工作表
    wb.remove(ws4)
    
    # 保存并生成文件
    wb.save('simple_excel.xlsx')
    ​ 说明:此步骤我就不运行了。
    
    3.2.5 设置工作表颜色
    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    
    # ...省略中间代码...
    
    # 设置工作表背景色
    ws1.sheet_properties.tabColor = '90EE90'
    ws2.sheet_properties.tabColor = '1E90FF'
    ws3.sheet_properties.tabColor = '90EE90'
    ws4.sheet_properties.tabColor = '1E90FF'
    
    # 保存并生成文件
    wb.save('simple_excel.xlsx')
    ​ 参数说明:
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    属性tabColor:设置工作表背景色,可以使用RGB颜色。
    ​ 效果如下:

    3.2.6 单元格写入数据

    写入单个数据

    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    
    # ...省略中间代码...
    
    # 单元格写入数据
    # 方法1:
    ws1['A1'] = '示例:'
    
    # 方法2:
    ws1.cell(row=1, column=1, value='示例:')
    
    # 保存并生成文件
    wb.save('simple_excel.xlsx')    
    批量写入数据
    from openpyxl import Workbook
    
    # 类实例化
    wb = Workbook()
    
    # ...省略中间代码...
    
    # 单元格写入数据
    data = [
        ["device_name", "device_ip", "vendor", "model", "sn", "os", "version", "update_time"],
        ['switch-01', "192.168.1.1", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
        ['switch-02', "192.168.1.2", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
        ['switch-03', "192.168.1.3", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
            ]
    for row in data:
        ws1.append(row)
    
    # 保存并生成文件
    wb.save('simple_excel.xlsx')    
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    ​ 参数说明:

    append:传入可迭代对象(字符串、列表、元组…),迭代写入单元格;
    ​ 效果如下:

    3.2.7 设置单元格背景色

    from openpyxl import Workbook
    from openpyxl.styles import PatternFill, Border, Side, Font, colors
    
    # 类实例化
    wb = Workbook()
    
    # ...省略中间代码...
    
    # 单元格填充背景色
    background_color = PatternFill(start_color='00BFFF', fill_type='solid')
    # 设置边框
    border = Border(left=Side(style='thin'),
                    right=Side(style='thin'),
                    top=Side(style='thin'),
                    bottom=Side(style='thin'))
    font_type = Font(color=colors.WHITE,
                     size=12,
                     b=True,
                     bold=True)
     # 设置字体居中
    Align = Alignment(horizontal='center', vertical='center')
     # 循环迭代cell并设置样式
    for row in ws1.iter_rows(min_row=2,max_row=2):
        for cell in row:
            cell.fill, cell.font, cell.alignment = background_color, font_type, Align
    
      8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    ​ 参数说明:

    类PatternFill:start_color、end_color为背景色、图案颜色、图案样式;
    类Border:设置边框线条样式,如线条宽度样式、对角线等;
    类Font:设置字体颜色、大小、下划线等;
    类Alignment:设置文本对齐方式,水平对齐、垂直对齐;
    ​ 效果如下:

    3.2.8 合并单元格

    # ...省略代码...
    
    # 合并单元格
    ws1.merge_cells('A1:H1')
    ws1.unmerge_cells('A1:H1')
    
    # ...省略代码...
    

      ​ 参数说明:

      merge_cells:合并单元格;
      unmerge_cells:取消合并单元格;
      效果如下:

      3.2.9 自动调整列单元格宽度

      from openpyxl import Workbook
      from openpyxl.styles import PatternFill, Border, Side, Font, colors,Alignment
      from openpyxl.utils import get_column_letter
      
      # 类实例化
      wb = Workbook()
      
      # ...省略中间代码...
      
      # 自动调整单元格宽度
      # 筛选出每一列中cell的最大长度,并作为调整列宽度的值。
      all_ws = wb.sheetnames
      for ws in all_ws:
          dims = {}
          ws = wb[ws]
          for row in ws.rows:
              for cell in row:
                  if cell.value:
                      dims[cell.column] = max(dims.get(cell.column, 0), len(str(cell.value)))
                      
          for col, value in dims.items():
              ws.column_dimensions[get_column_letter(col)].width = value + 3
          dims.clear()
      
        8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

      ​ 思路解读:
      ​ 先找出列所有数据的最大长度,然后按照这个长度自动调整单元格的宽度。

      先定义一个空字典dims,用来存放键值对,column(列):value(单元格cell长度);
      每一列的单元格value长度一一比较取得最大值,最后取得最最最大值,作为每列的宽度值width;
      方法get_column_letter():是将cell.column整数值1、2、3…转换为列字符串’A’、‘B’、 ‘C’…;
      方法column_dimensions:通过width设置列的宽度,建议再加大一点;
      ​ 效果如下:

      3.2.10 图表

      from openpyxl.chart import BarChart3D, Reference
      
      # ...省略中间代码...
      
      
      # 单元格先写入数据
      data = [
          ["Fruit", "https://cdn.jxasp.com:9143/image/2017", "https://cdn.jxasp.com:9143/image/2018", "https://cdn.jxasp.com:9143/image/2019", "https://cdn.jxasp.com:9143/image/2020"],
          ['Apples', 10000, 5000, 8000, 6000],
          ['Pears', 2000, 3000, 4000, 5000],
          ['Bananas', 6000, 6000, 6500, 6000],
          ['Oranges', 500, 300, 200, 700],
      ]
      for row in data:
          ws2.append(row)
          
      # 开始绘3D柱状图
      chart = BarChart3D()
      chart.type = 'col'
      chart.style = 10
      chart.title = '销量柱状图'
      chart.x_axis.title = '水果'
      chart.y_axis.title = '销量'
      
      # set_categories() X轴设置数据, add_data() y轴设置数据
      data = Reference(ws2, min_col=2, min_row=1, max_col=5, max_row=5)
      series = Reference(ws2, min_col=1, min_row=2, max_row=5)
      chart.add_data(data=data, titles_from_data=True)
      chart.set_categories(series)
      ws2.add_chart(chart, 'A7')
      
        8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30

      ​ 参数说明:

      属性type:可以设置列col 和水平bar两种方式;
      属性style:设置样式,为整数值1~48之间;
      属性title:设置标题;
      属性x_axis.title:x轴的标题;
      属性y_axis.title:y轴的标题;
      类Reference:引用单元格范围的数据;
      方法add_data:设置Y轴数据;
      方法set_categories:设置X轴数据;
      ​ 效果如下:

      3.3 加载工作簿
      通过load_workbook方法加载已存在的excel文件,并以read_only只读方式读取内容,不能进行编辑。

      load_workbook方法参数:

      filename:文件路径或文件对象;
      read_only:是否为只读,针对阅读做了优化,不能编辑内容;
      keep_vba:是否保留vba内(并不意味可以用它),缺省保留;
      data_only:单元格是否保留公式或结果;
      keep_links:是否保留外部链接,缺省保留;
      3.3.1 获取工作表

      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 获取所有工作表
      print('所有工作表: ', wb.sheetnames)
      
      # 关闭工作簿
      wb.close()
      
        8
      • 9

      回显结果如下:

      所有工作表: [‘1_sheet’, ‘2_sheet’, ‘3_sheet’, ‘3_sheet Copy’]
      ​ 参数说明:

      参数read_only=True:表示以只读模式打开工作簿;

      方法sheetnames:返回的是一个列表形式的工作表名称;

      方法close():仅在read-only 和 write-only 模式使用即可,下同,故不做多次解释;

      3.3.2 遍历工作表

      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 获取单个工作表
      print('第1个工作表:', wb.sheetnames[0])
      print('第2个工作表:', wb.sheetnames[1])
      print('第3个工作表:', wb.sheetnames[2])
      print('第4个工作表:', wb.sheetnames[3])
      # 循环遍历工作表
      for ws in wb.sheetnames:
          print(ws)
      
      # 关闭工作簿
      wb.close()
      
      
      # 回显结果如下:1个工作表: 1_sheet
      第2个工作表: 2_sheet
      第3个工作表: 3_sheet
      第4个工作表: 3_sheet Copy
      1_sheet
      2_sheet
      3_sheet
      3_sheet Copy
      3.3.3 获取单元格数据
      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 第一个工作表对象
      ws1 = wb[wb.sheetnames[0]]
      # 或者
      # ws1 = wb['1_sheet']
      
      # 获取某个单元格
      print(f"获取单元格数据: {ws1['A3'].value}")
      
      # 选取范围获取单元格数据
      for row in ws1['A3:H3']:
          for cell in row:
              print(f"按范围获取单元格数据: {cell.value}")
      
      # 关闭工作簿
      wb.close()
      
        8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46

      回显结果如下:

      获取单元格数据: switch-01

      按范围获取单元格数据: switch-01
      按范围获取单元格数据: 192.168.1.1
      按范围获取单元格数据: cisco
      按范围获取单元格数据: WS-C3560G-24TS
      按范围获取单元格数据: FOC00000000
      按范围获取单元格数据: cisco_ios
      按范围获取单元格数据: 12.2(50)SE5
      按范围获取单元格数据: 1 weeks, 1 minutes
      3.3.4 遍历行
      指定行

      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 第一个工作表对象
      ws1 = wb[wb.sheetnames[0]]
      
      # 指定第二行
      for cell in ws1['2']:
          print(cell.value)
          
      # 关闭工作簿
      wb.close()
      
      
      # 回显结果如下:
      device_name
      device_ip
      vendor
      model
      sn
      os
      version
      update_time
      指定行范围
      # ... 省略代码...
      
      # 指定行范围
      for row in ws1['2:3']:
          for cell in row:
              print(cell.value)
          
      # ... 省略代码...
      
      
      # 回显结果如下:
      device_name
      device_ip
      vendor
      model
      sn
      os
      version
      update_time
      switch-01
      192.168.1.1
      cisco
      WS-C3560G-24TS
      FOC00000000
      cisco_ios
      12.2(50)SE5
      1 weeks, 1 minutes
      方法iter_rows,遍历行
      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 第一个工作表对象
      ws1 = wb[wb.sheetnames[0]]
      
      # 循环遍历行
      for row in ws1.iter_rows(min_row=2, max_row=2, min_col=1, max_col=8):
          for cell in row:
              print(f"单元格数据:{cell.value}")
              
      # 关闭工作簿
      wb.close()
      
      
      # 回显结果如下:
      单元格数据:device_name
      单元格数据:device_ip
      单元格数据:vendor
      单元格数据:model
      单元格数据:sn
      单元格数据:os
      单元格数据:version
      单元格数据:update_time
      ​ 参数说明:
      
      方法iter_rows:通过该方法可以遍历每行数据,是一个tuple,可再次循环通过.value获取单元格数据;
      3.3.5 遍历列
      指定列
      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx', read_only=True)
      
      # 第一个工作表对象
      ws1 = wb[wb.sheetnames[0]]
      
      # 指定第一列
      for cell in ws1['A']:
          print(cell.value)
          
      # 关闭工作簿
      wb.close()
      
      
      # 回显结果如下:
      示例:
      device_name
      switch-01
      switch-02
      switch-03
      指定列范围
      # ... 省略代码...
      
      # 指定列范围
      for col in ws1['A:B']:
          for cell in col:
              print(cell.value)
              
      # ... 省略代码...        
              
      # 回显结果如下:
      示例:
      device_name
      switch-01
      switch-02
      switch-03
      None
      device_ip
      192.168.1.1
      192.168.1.2
      192.168.1.3
      方法iter_cols,遍历列
      from openpyxl import load_workbook as open
      # 类示例化
      wb = open('simple_excel.xlsx')
      
      # 第一个工作表对象
      ws1 = wb[wb.sheetnames[0]]
      
      # 循环遍历列
      for col in ws1.iter_cols(min_row=3, max_row=5, min_col=1, max_col=1):
          for cell in col:
              print(f"单元格数据:{cell.value}")
              
      # 关闭工作簿
      wb.close()
      
        8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78
      • 79
      • 80
      • 81
      • 82
      • 83
      • 84
      • 85
      • 86
      • 87
      • 88
      • 89
      • 90
      • 91
      • 92
      • 93
      • 94
      • 95
      • 96
      • 97
      • 98
      • 99
      • 100
      • 101
      • 102
      • 103
      • 104
      • 105
      • 106
      • 107
      • 108
      • 109
      • 110
      • 111
      • 112
      • 113
      • 114
      • 115
      • 116
      • 117
      • 118
      • 119
      • 120
      • 121
      • 122
      • 123
      • 124
      • 125
      • 126
      • 127
      • 128
      • 129
      • 130
      • 131
      • 132
      • 133
      • 134
      • 135
      • 136
      • 137
      • 138
      • 139
      • 140

      回显结果如下:

      单元格数据:switch-01
      单元格数据:switch-02
      单元格数据:switch-03
      参数说明:

      方法iter_cols:通过该方法可以遍历每python基础教程列数据,是一个tuple,可再次循环通过.value获取单元格数据,另外和iter_rows不一样的就是load_workbook 不能使用read_only=True;

      相关技术文章

      最新源码

      下载排行榜

      点击QQ咨询
      开通会员
      返回顶部
      ×
      微信扫码支付
      微信扫码支付
      确定支付下载
      请使用微信描二维码支付
      ×

      提示信息

      ×

      选择支付方式

      • 微信支付
      • 支付宝付款
      确定支付下载