Python对excel的基本操作
1. 前言
2. 实验环境
3. 基本操作
3.3.1 获取工作表
3.3.2 遍历工作表
3.3.3 获取单元格数据
3.3.4 遍历行
3.3.5 遍历列
指定行
指定行范围
方法iter_rows,遍历行
指定列
指定列范围
方法iter_cols,遍历列
3.2.1 新创建工作簿
3.2.2 缺省工作表
3.2.3 创建工作表
3.2.4 删除工作表
颜色">3.2.5 设置工作表颜色
3.2.6 单元格写入数据
3.2.7 设置单元格背景色
3.2.8 合并单元格
3.2.9 自动调整列单元格宽度
3.2.10 图表
批量写入数据
3.1 安装openpyxl第三方库
3.2 新建工作簿
3.3 加载工作簿
附录
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第三方库
首先,我们得先安装一下第三方库`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()# 激活并缺省创建第一个工作表:sheetws1 = wb.active# 第一个工作表命名:1_sheetws1.title = '1_sheet'# 保存并生成文件wb.save('simple_excel.xlsx')
效果如下所示:
3.2.3 创建工作表
from openpyxl import Workbook# 类实例化wb = Workbook()# 激活并缺省创建第一个工作表ws1 = wb.active# 第一个工作表命名ws1.title = '1_sheet'# 创建工作表3ws3 = wb.create_sheet(title='3_sheet', index=2)# 创建工作表2ws2 = wb.create_sheet('2_sheet', 1)# 创建工作表4ws4 = wb.copy_worksheet(ws3)# 保存并生成文件wb.save('simple_excel.xlsx')
参数说明:
属性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')
参数说明:
属性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')
参数说明:
append:传入可迭代对象(字符串、列表、元组...),迭代写入单元格;
效果如下:
3.2.7 设置单元格背景色
from openpyxl import Workbookfrom 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
参数说明:
类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 Workbookfrom openpyxl.styles import PatternFill, Border, Side, Font, colors,Alignmentfrom openpyxl.utils import get_column_letter# 类实例化wb = Workbook()# ...省略中间代码...# 自动调整单元格宽度# 筛选出每一列中cell的最大长度,并作为调整列宽度的值。all_ws = wb.sheetnamesfor 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()
思路解读:
先找出列所有数据的最大长度,然后按照这个长度自动调整单元格的宽度。
先定义一个空字典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", "2017", "2018", "2019", "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 = 10chart.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')
参数说明:
属性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()# 回显结果如下:所有工作表: ['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 Copy1_sheet2_sheet3_sheet3_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()# 回显结果如下:获取单元格数据: 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_namedevice_ipvendormodelsnosversionupdate_time
指定行范围
# ... 省略代码...# 指定行范围for row in ws1['2:3']: for cell in row: print(cell.value) # ... 省略代码...# 回显结果如下:device_namedevice_ipvendormodelsnosversionupdate_timeswitch-01192.168.1.1ciscoWS-C3560G-24TSFOC00000000cisco_ios12.2(50)SE51 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_nameswitch-01switch-02switch-03
指定列范围
# ... 省略代码...# 指定列范围for col in ws1['A:B']: for cell in col: print(cell.value) # ... 省略代码... # 回显结果如下:示例:device_nameswitch-01switch-02switch-03Nonedevice_ip192.168.1.1192.168.1.2192.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()# 回显结果如下:单元格数据:switch-01单元格数据:switch-02单元格数据:switch-03
参数说明:
方法iter_cols:通过该方法可以遍历每列数据,是一个
tuple
,可再次循环通过.value
获取单元格数据,另外和iter_rows
不一样的就是load_workbook 不能使用read_only=True
;