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中文编码那些事
Jun 25 Python
Python日志模块logging简介
Apr 13 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
import的本质解析
Oct 30 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
python读文件的步骤
Oct 08 Python
python用requests实现http请求代码实例
Oct 31 Python
用python解压分析jar包实例
Jan 16 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
Python实战之实现简易的学生选课系统
May 25 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实现购物车功能(下)
2016/01/05 PHP
php简单实现数组分页的方法
2016/04/30 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
jQuery数组处理方法汇总
2011/06/20 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
原生JS实现pc端轮播图效果
2020/12/21 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
超市业务员岗位职责
2013/12/05 职场文书
入学申请自荐信范文
2014/02/26 职场文书
蓝颜请假条
2014/04/11 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
员工表扬信怎么写
2015/05/05 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
MySQL创建管理RANGE分区
2022/04/13 MySQL
springboot读取resources下文件的方式详解
2022/06/21 Java/Android