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 相关文章推荐
python模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
Python生成器(Generator)详解
Apr 13 Python
Python类属性与实例属性用法分析
May 09 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
Python编程中flask的简介与简单使用
Dec 28 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Matplotlib配色之Colormap详解
Jan 05 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 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中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
python打开网页和暂停实例
2014/09/30 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
淘宝网店营销策划书
2014/01/11 职场文书
大学生入党思想汇报
2014/01/14 职场文书
学校岗位设置方案
2014/01/16 职场文书
法学专业求职信
2014/07/15 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
小学生班干部竞选稿
2015/11/20 职场文书