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使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
python利用opencv保存、播放视频
Nov 02 Python
Django解决frame拒绝问题的方法
Dec 18 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解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
js实现随机数小游戏
2019/06/28 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python logging添加filter教程
2019/12/24 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
python实现自动打卡的示例代码
2020/10/10 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
学生干部的自我评价分享
2014/01/18 职场文书
五年级语文教学反思
2014/01/30 职场文书
高中打架检讨书
2014/02/13 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
工作保证书怎么写
2015/02/28 职场文书
2016公司年会通知范文
2015/04/25 职场文书
仰望星空观后感
2015/06/10 职场文书
社区服务理念口号
2015/12/25 职场文书