Python对excel的基本操作方法


Posted in Python onFebruary 18, 2021

1. 前言

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

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

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

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

Python对excel的基本操作方法

2. 实验环境

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

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

3. 基本操作

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

3.1 安装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')

​效果如下所示:

Python对excel的基本操作方法

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颜色。

​效果如下:

Python对excel的基本操作方法

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:传入可迭代对象(字符串、列表、元组...),迭代写入单元格;

​效果如下:

Python对excel的基本操作方法

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:设置文本对齐方式,水平对齐、垂直对齐;

​效果如下:

Python对excel的基本操作方法

3.2.8 合并单元格

# ...省略代码...

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

# ...省略代码...

​参数说明:

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

效果如下:Python对excel的基本操作方法

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设置列的宽度,建议再加大一点;

​效果如下:

Python对excel的基本操作方法

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轴数据;

​效果如下:

Python对excel的基本操作方法

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-onlywrite-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

附录openpyxl官方文档
openpyxl

RGB颜色参考
RGB颜色参考

到此这篇关于Python对excel的基本操作的文章就介绍到这了,更多相关Python excel操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

到此这篇关于Python对excel的基本操作方法的文章就介绍到这了,更多相关Python excel操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python中去空格函数的用法
Aug 21 Python
Python读写Excel文件方法介绍
Nov 22 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
使用Python对Excel进行读写操作
Mar 30 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
Tensorflow之Saver的用法详解
Apr 23 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 #Python
Python操作Excel的学习笔记
Feb 18 #Python
手把手教你用Django执行原生SQL的方法
Feb 18 #Python
python中封包建立过程实例
Feb 18 #Python
python解包用法详解
Feb 17 #Python
python压包的概念及实例详解
Feb 17 #Python
python解包概念及实例
Feb 17 #Python
You might like
常见的PHP五种设计模式小结
2011/03/23 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
js实现动态时钟
2020/03/12 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
Python3 读取Word文件方式
2020/02/13 Python
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
离婚财产分配协议书
2014/10/21 职场文书
自我检讨报告
2015/01/28 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
python缺失值填充方法示例代码
2022/12/24 Python