Python对excel的基本操作

1. 前言

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

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

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

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

2. 实验环境

  • windown 10
  • Python3.69
  • Pycharm
  • Python第三方库openpyxl
  • excel 2013

说明:各位实验环境请随意组合,python版本是3.x以上。

3. 基本操作

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

3.1 安装openpyxl第三方库

  1. 首先,我们得先安装一下第三方库`openpyxl`,使用如下命令安装即可。
  1. C:\>pip install openpyxl

3.2 新建工作簿

3.2.1 新创建工作簿

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # 保存并生成文件
  5. wb.save('simple_excel.xlsx')

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

3.2.2 缺省工作表

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # 激活并缺省创建第一个工作表:sheet
  5. ws1 = wb.active
  6. # 第一个工作表命名:1_sheet
  7. ws1.title = '1_sheet'
  8. # 保存并生成文件
  9. wb.save('simple_excel.xlsx')

​ 效果如下所示:

3.2.3 创建工作表

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # 激活并缺省创建第一个工作表
  5. ws1 = wb.active
  6. # 第一个工作表命名
  7. ws1.title = '1_sheet'
  8. # 创建工作表3
  9. ws3 = wb.create_sheet(title='3_sheet', index=2)
  10. # 创建工作表2
  11. ws2 = wb.create_sheet('2_sheet', 1)
  12. # 创建工作表4
  13. ws4 = wb.copy_worksheet(ws3)
  14. # 保存并生成文件
  15. wb.save('simple_excel.xlsx')

​ 参数说明:

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

3.2.4 删除工作表

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # 激活并缺省创建第一个工作表
  5. # ...省略中间代码...
  6. ws4 = wb.copy_worksheet(ws3)
  7. # 删除工作表
  8. wb.remove(ws4)
  9. # 保存并生成文件
  10. wb.save('simple_excel.xlsx')

​ 说明:此步骤我就不运行了。

3.2.5 设置工作表颜色

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # ...省略中间代码...
  5. # 设置工作表背景色
  6. ws1.sheet_properties.tabColor = '90EE90'
  7. ws2.sheet_properties.tabColor = '1E90FF'
  8. ws3.sheet_properties.tabColor = '90EE90'
  9. ws4.sheet_properties.tabColor = '1E90FF'
  10. # 保存并生成文件
  11. wb.save('simple_excel.xlsx')

​ 参数说明:

  • 属性tabColor:设置工作表背景色,可以使用RGB颜色。

​ 效果如下:

3.2.6 单元格写入数据

  1. #### 写入单个数据
  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # ...省略中间代码...
  5. # 单元格写入数据
  6. # 方法1:
  7. ws1['A1'] = '示例:'
  8. # 方法2:
  9. ws1.cell(row=1, column=1, value='示例:')
  10. # 保存并生成文件
  11. wb.save('simple_excel.xlsx')

批量写入数据

  1. from openpyxl import Workbook
  2. # 类实例化
  3. wb = Workbook()
  4. # ...省略中间代码...
  5. # 单元格写入数据
  6. data = [
  7. ["device_name", "device_ip", "vendor", "model", "sn", "os", "version", "update_time"],
  8. ['switch-01', "192.168.1.1", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
  9. ['switch-02', "192.168.1.2", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
  10. ['switch-03', "192.168.1.3", "cisco", 'WS-C3560G-24TS', "FOC00000000", "cisco_ios", "12.2(50)SE5", "1 weeks, 1 minutes" ],
  11. ]
  12. for row in data:
  13. ws1.append(row)
  14. # 保存并生成文件
  15. wb.save('simple_excel.xlsx')

​ 参数说明:

  • append:传入可迭代对象(字符串、列表、元组...),迭代写入单元格;

​ 效果如下:

3.2.7 设置单元格背景色

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

​ 参数说明:

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

​ 效果如下:

3.2.8 合并单元格

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

​ 参数说明:

  • merge_cells:合并单元格;
  • unmerge_cells:取消合并单元格;

效果如下:

3.2.9 自动调整列单元格宽度

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

​ 思路解读:

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

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

​ 效果如下:

3.2.10 图表

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

​ 参数说明:

  • 属性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 获取工作表

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 获取所有工作表
  5. print('所有工作表: ', wb.sheetnames)
  6. # 关闭工作簿
  7. wb.close()
  8. # 回显结果如下:
  9. 所有工作表: ['1_sheet', '2_sheet', '3_sheet', '3_sheet Copy']

​ 参数说明:

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

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

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

    3.3.2 遍历工作表

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 获取单个工作表
  5. print('第1个工作表:', wb.sheetnames[0])
  6. print('第2个工作表:', wb.sheetnames[1])
  7. print('第3个工作表:', wb.sheetnames[2])
  8. print('第4个工作表:', wb.sheetnames[3])
  9. # 循环遍历工作表
  10. for ws in wb.sheetnames:
  11. print(ws)
  12. # 关闭工作簿
  13. wb.close()
  14. # 回显结果如下:
  15. 1个工作表: 1_sheet
  16. 2个工作表: 2_sheet
  17. 3个工作表: 3_sheet
  18. 4个工作表: 3_sheet Copy
  19. 1_sheet
  20. 2_sheet
  21. 3_sheet
  22. 3_sheet Copy

3.3.3 获取单元格数据

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 第一个工作表对象
  5. ws1 = wb[wb.sheetnames[0]]
  6. # 或者
  7. # ws1 = wb['1_sheet']
  8. # 获取某个单元格
  9. print(f"获取单元格数据: {ws1['A3'].value}")
  10. # 选取范围获取单元格数据
  11. for row in ws1['A3:H3']:
  12. for cell in row:
  13. print(f"按范围获取单元格数据: {cell.value}")
  14. # 关闭工作簿
  15. wb.close()
  16. # 回显结果如下:
  17. 获取单元格数据: switch-01
  18. 按范围获取单元格数据: switch-01
  19. 按范围获取单元格数据: 192.168.1.1
  20. 按范围获取单元格数据: cisco
  21. 按范围获取单元格数据: WS-C3560G-24TS
  22. 按范围获取单元格数据: FOC00000000
  23. 按范围获取单元格数据: cisco_ios
  24. 按范围获取单元格数据: 12.2(50)SE5
  25. 按范围获取单元格数据: 1 weeks, 1 minutes

3.3.4 遍历行

指定行

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 第一个工作表对象
  5. ws1 = wb[wb.sheetnames[0]]
  6. # 指定第二行
  7. for cell in ws1['2']:
  8. print(cell.value)
  9. # 关闭工作簿
  10. wb.close()
  11. # 回显结果如下:
  12. device_name
  13. device_ip
  14. vendor
  15. model
  16. sn
  17. os
  18. version
  19. update_time

指定行范围

  1. # ... 省略代码...
  2. # 指定行范围
  3. for row in ws1['2:3']:
  4. for cell in row:
  5. print(cell.value)
  6. # ... 省略代码...
  7. # 回显结果如下:
  8. device_name
  9. device_ip
  10. vendor
  11. model
  12. sn
  13. os
  14. version
  15. update_time
  16. switch-01
  17. 192.168.1.1
  18. cisco
  19. WS-C3560G-24TS
  20. FOC00000000
  21. cisco_ios
  22. 12.2(50)SE5
  23. 1 weeks, 1 minutes

方法iter_rows,遍历行

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 第一个工作表对象
  5. ws1 = wb[wb.sheetnames[0]]
  6. # 循环遍历行
  7. for row in ws1.iter_rows(min_row=2, max_row=2, min_col=1, max_col=8):
  8. for cell in row:
  9. print(f"单元格数据:{cell.value}")
  10. # 关闭工作簿
  11. wb.close()
  12. # 回显结果如下:
  13. 单元格数据:device_name
  14. 单元格数据:device_ip
  15. 单元格数据:vendor
  16. 单元格数据:model
  17. 单元格数据:sn
  18. 单元格数据:os
  19. 单元格数据:version
  20. 单元格数据:update_time

​ 参数说明:

  • 方法iter_rows:通过该方法可以遍历每行数据,是一个tuple,可再次循环通过.value获取单元格数据;

3.3.5 遍历列

指定列

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx', read_only=True)
  4. # 第一个工作表对象
  5. ws1 = wb[wb.sheetnames[0]]
  6. # 指定第一列
  7. for cell in ws1['A']:
  8. print(cell.value)
  9. # 关闭工作簿
  10. wb.close()
  11. # 回显结果如下:
  12. 示例:
  13. device_name
  14. switch-01
  15. switch-02
  16. switch-03

指定列范围

  1. # ... 省略代码...
  2. # 指定列范围
  3. for col in ws1['A:B']:
  4. for cell in col:
  5. print(cell.value)
  6. # ... 省略代码...
  7. # 回显结果如下:
  8. 示例:
  9. device_name
  10. switch-01
  11. switch-02
  12. switch-03
  13. None
  14. device_ip
  15. 192.168.1.1
  16. 192.168.1.2
  17. 192.168.1.3

方法iter_cols,遍历列

  1. from openpyxl import load_workbook as open
  2. # 类示例化
  3. wb = open('simple_excel.xlsx')
  4. # 第一个工作表对象
  5. ws1 = wb[wb.sheetnames[0]]
  6. # 循环遍历列
  7. for col in ws1.iter_cols(min_row=3, max_row=5, min_col=1, max_col=1):
  8. for cell in col:
  9. print(f"单元格数据:{cell.value}")
  10. # 关闭工作簿
  11. wb.close()
  12. # 回显结果如下:
  13. 单元格数据:switch-01
  14. 单元格数据:switch-02
  15. 单元格数据:switch-03

参数说明:

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

附录


如果喜欢的我的文章,欢迎关注我的公众号:点滴技术,扫码关注,不定期分享

Python对excel的基本操作的更多相关文章

  1. Python操作excel表格

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件 注:本篇代码在Python3环境下运行 首先导入两个模块xlrd和xlwt,xlrd用来读取Exc ...

  2. python 读 excel 模块: xlrd

    主要来自:[ python中使用xlrd.xlwt操作excel表格详解 ] 为了方便阅读, 我将原文两个模块拆分为两篇博文: [ python 读 excel 模块: xlrd ] [ python ...

  3. Python导出Excel为Lua/Json/Xml实例教程(三):终极需求

    相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...

  4. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  5. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  6. python读取excel一例-------从工资表逐行提取信息

    在工作中经常要用到python操作excel,比如笔者公司中一个人事MM在发工资单的时候,需要从几百行的excel表中逐条的粘出信息,然后逐个的发送到员工的邮箱中.人事MM对此事不胜其烦,终于在某天请 ...

  7. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  8. 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)

    算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...

  9. python操作excel表格(xlrd/xlwt)

    最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...

随机推荐

  1. 精通MySQL之架构篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  2. # Functions are First-Class Citizens in Python 一等公民

    # Functions are First-Class Citizens in Python 一等公民https://cn.bing.com/search?form=MOZSBR&pc=MOZ ...

  3. (SqlServe)关于字符串长度被截断的问题

    1. 问题描述 在同步数据时常常会发现一个错误:将截断字符串或二进制数据. 2. 问题原因 这个问题出现的原因是:要插入的数值字段的长度超出了数据库中字段的长度.比如:插入的字符串字节长度是40,数据 ...

  4. python 字典的用法,访问、增删合并等

    python字典可以存储任意类型的对象,字典的每个键:值 冒号(:)分割,每个对直接逗号(,)分割,整个字典包含在{}中,例如:d = {key1 : value1, key2 : value2, k ...

  5. Java中的异常处理机制《》

    异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性. Java异常机制主要依赖于try.catch.finall ...

  6. 深信服edr控制中心漏洞——验证码逻辑错误

    验证码逻辑错误 文件:tool/log/l.php的第93行

  7. Java泛型学习---第二篇

    泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ...

  8. 三维CAD——基于B_rep的建模操作

    内容来自高老师的<三维CAD建模>课,本文就主要介绍半边结构和欧拉操作以及代码实现. 1. 边界表示法及其数据结构 · 拓扑结构 a.拓扑元素:面.边.点.体 b.拓扑关系:9种.V{V} ...

  9. HDU6370 Werewolf 【基环内向树】

    HDU6370 Werewolf 题意: 有\(N\)个人玩狼人杀,只有村民和狼人,每个人指定另一个人并指出一个身份,其中:村民是不会说谎的,狼人是有可能说谎的,问在所有情况下必然是狼人的人数和必然是 ...

  10. Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) A. Contest for Robots(数学)

    题意: n 道题,2 个答题者,已知二者的做题情况,你是受贿裁判,可以给每题指定分值(≥1),求甲乙分数(甲>乙)相差最小时最大分值的最小值. 思路: 统计只有甲或乙做出的题目数. 加一取下整判 ...