Python对excel的基本操作
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第三方库
首先,我们得先安装一下第三方库`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')
参数说明:
- 属性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 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
参数说明:
- 类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()
思路解读:
先找出列所有数据的最大长度,然后按照这个长度自动调整单元格的宽度。
- 先定义一个空字典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 = 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')
参数说明:
- 属性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 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()
# 回显结果如下:
获取单元格数据: 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()
# 回显结果如下:
单元格数据:switch-01
单元格数据:switch-02
单元格数据:switch-03
参数说明:
- 方法iter_cols:通过该方法可以遍历每列数据,是一个
tuple,可再次循环通过.value获取单元格数据,另外和iter_rows不一样的就是load_workbook 不能使用read_only=True;
附录
如果喜欢的我的文章,欢迎关注我的公众号:点滴技术,扫码关注,不定期分享

Python对excel的基本操作的更多相关文章
- Python操作excel表格
用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件 注:本篇代码在Python3环境下运行 首先导入两个模块xlrd和xlwt,xlrd用来读取Exc ...
- python 读 excel 模块: xlrd
主要来自:[ python中使用xlrd.xlwt操作excel表格详解 ] 为了方便阅读, 我将原文两个模块拆分为两篇博文: [ python 读 excel 模块: xlrd ] [ python ...
- Python导出Excel为Lua/Json/Xml实例教程(三):终极需求
相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- python读取excel一例-------从工资表逐行提取信息
在工作中经常要用到python操作excel,比如笔者公司中一个人事MM在发工资单的时候,需要从几百行的excel表中逐条的粘出信息,然后逐个的发送到员工的邮箱中.人事MM对此事不胜其烦,终于在某天请 ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
- 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)
算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...
- python操作excel表格(xlrd/xlwt)
最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...
随机推荐
- 人工智能"眼睛"——摄像头
摄像头机器视觉人工智能的"眼睛",其重要性在嵌入式领域不言而喻.但是如何理解和使用摄像头却是一个非常棘手的问题.本文主要针对调试摄像头过程中遇到的问题,对摄像头的基本原理及概述进行 ...
- 处理K8S PVC删除后pod报错
报错如下 Jun 19 17:15:18 node1 kubelet[1722]: E0619 17:15:18.381558 1722 desired_state_of_world_populato ...
- Git:.gitignore和.gitkeep文件的使用 让空文件夹被跟踪
Git:.gitignore和.gitkeep文件的使用 Git:.gitignore和.gitkeep文件的使用 https://majing.io/posts/10000001781172 .gi ...
- C# 防止程序多开(重复开启)
Mutex(mutual exclusion,互斥)是 .Net Framework 中提供跨多个线程同步访问的一个类.它非常类似了 Monitor 类,因为他们都只有一个线程能拥有锁定.而操作系统能 ...
- Google performance Tools (gperftools) 使用心得
Google performance Tools (gperftools) 使用心得 gperftools是google开发的一款非常实用的工具集,主要包括:性能优异的malloc free内存分配器 ...
- RocketMQ 的几个简单问题与答案
1 单机版消息中心 一个消息中心,最基本的需要支持多生产者.多消费者,例如下: class Scratch { public static void main(String[] args) { // ...
- C# 实现语音聊天
一.语音聊天说专业点就是即时语音,是一种基于网络的快速传递语音信息的技术,普遍应用于各类社交软件中,优势主要有以下几点: (1)时效性:视频直播会因为带宽问题有时出现延迟高的问题,而语音直播相对来说会 ...
- 玩遍博客网站,我整理了 Hexo 及其流行的风格主题
搭建博客网站是个人进入互联网世界的最常见方式之一.伴随着网站技术的发展,如何搭建博客网站已经变得非常容易了.当然,你可以选择诸如 新浪博客.CSDN.博客园 之类的大型网站,快速创建依赖于大平台的个人 ...
- vscode 刚安装运行cnpm命令报错
平时的开发工具什么都用,最近手贱把vscode卸载掉了,然而重新安装时,自已以前的什么配置都没了~~~~~~,又开始从头搞起,但是一切安装配置完毕,执行cnpm命令时报错,晕!!!!!! 解决办法:执 ...
- Qt项目的发布
Qt项目的发布 (1)首先将项目调为发布版 (2)找到缺失的DLL文件 发布好了后,双击生成的exe文件可能会出现如下的问题 像这样的错误警告可能会弹出好几个,对于这种错误有2种解决方案. 第一种:配 ...