python 的 openpyxl模块 读取 Excel文件的方法


Posted in Python onSeptember 09, 2019

Python 的 openpyxl 模块可以让我们能读取和修改 Excel 文件。

python 的 openpyxl模块 读取 Excel文件的方法

首先让我们先理解一些 Excel 基础概念。

1 Excel 基础概念

Excel 文件也称做为工作簿。每个工作簿可以包含多个工作表(Sheet)。用户当前查看的表或关闭 Excel 前最后查看的表,称为活动表。

每一张表都是由列和行构成的。列是以 A 开始的字母表示;而行是以 1 开始的数字表示的。由特定行和列所指定的方格称为单元格。每个单元格都可以包含一个数字或文本。这些单元格就构成了这张表。

2 安装 openpyxl

通过 pip 就可以安装最新版的 openpyxl。

pip install openpyxl

3 读取 Excel

假设有这样一份世界人口统计 Excel 文档,内容如下:

python 的 openpyxl模块 读取 Excel文件的方法

3.1 加载

wb = openpyxl.load_workbook('population.xlsx')
print('wb 类型 :')
print(type(wb), '\n')

运行结果:

python 的 openpyxl模块 读取 Excel文件的方法

wb 类型 : <class 'openpyxl.workbook.workbook.Workbook'>

导入 openpyxl 模块之后,就可以使用 openpyxl.load_workbook() 函数来加载 Excel 文档咯。这个 Excel 文件表示为 Workbook 对象。

注意:load_workbook() 函数中的文件,必须在当前工作目录。可以导入 os 模块,利用 os.getcwd() 来获悉当前工作目录。os 还提供了 chdir() 方法,可以改变当前工作目录。

import os
print('当前工作目录 :')
print(os.getcwd(), '\n')

运行结果:

python 的 openpyxl模块 读取 Excel文件的方法 

3.2 读取 Excel 工作表(sheet)

...
print('取得所有工作表的表名 :')
print(wb.sheetnames, '\n')

print('取得某张工作表 :')
sheet = wb['Sheet3']
print(type(sheet))
print('表名 - ' + sheet.title, '\n')

print('取得活动工作表 :')
active_sheet = wb.active
print('表名 - ' + active_sheet.title, '\n')

运行结果:

取得所有工作表的表名 : ['Sheet1', 'Sheet2', 'Sheet3']

取得某张工作表 : <class 'openpyxl.worksheet.worksheet.Worksheet'> 表名 - Sheet3

取得活动工作表 : 表名 - Sheet1

  • Workbook 对象的 sheetnames 属性可以获取所有 sheet 表的表名列表。
  • Workbook 对象的 active 属性,会获取当前活动表,即打开 Excel 时出现的工作表。
  • 获取 Worksheet 对象后,我们就可以通过 title 属性得到 sheet 的名称。

3.3 读取单元格 (Cell)

...
print('取得 A1 单元格 :')
cell = active_sheet['A1']
print(cell)
print(cell.value, '\n')

print('取得 B1 单元格 :')
cell = active_sheet['B1']
print(cell)
print(cell.value, '\n')

print('行号为 ' + str(cell.row) + ',列号为 ' + str(cell.column) + ' 的单元格,其值为 ' + cell.value, '\n')
print('单元格 ' + cell.coordinate + ' 其值为 ' + cell.value, '\n')

print('取得 C1 单元格的值 :')
print(active_sheet['C1'].value, '\n')

print('通过指定行与列,来获取单元格:')
print(active_sheet.cell(row=1, column=2))
print(active_sheet.cell(row=1, column=2).value)

print('迭代行与列,来获取单元格的值:')
for i in range(1, 8, 2):
  print(i, active_sheet.cell(row=i, column=2).value)
print('\n')

运行结果:

取得 A1 单元格 : <Cell 'Sheet1'.A1> 排名

取得 B1 单元格 : <Cell 'Sheet1'.B1> 国家

行号为 1,列号为 2 的单元格,其值为 国家

单元格 B1 其值为 国家

取得 C1 单元格的值 : 人口

通过指定行与列,来获取单元格: <Cell 'Sheet1'.B1> 国家 迭代行与列,来获取单元格的值: 1 国家 3 印度 5 印度尼西亚 7 巴基斯坦

可以通过单元格的名字(比如:A1)来获取 Cell 对象。

  •  Cell 对象的 value 属性,存放的是该单元格中所保存的值。
  • Cell 对象的 row、 column 和 coordinate 属性,存放的是该单元格的位置信息。
  • 用字母来指定列比较奇怪,因此我们也可以通过 sheet 的 cell 方法直接指定行(row)与列(column),来获取单元格 Cell 对象。

3.4 获取工作表大小

print('获取工作表的大小:')
print('总行数 -> ' + str(active_sheet.max_row))
print('总列数 -> ' + str(active_sheet.max_column))

运行结果:

获取工作表的大小: 总行数 -> 11 总列数 -> 4

Worksheet 对象的 max_row 与 max_column,可以获取工作表的总行数与总列数,即工作表的大小。

3.5 列转换函数

openpyxl 提供了两个函数,用于转换列号:

  • openpyxl.utils.get_column_letter -> 会把数字转化为字母。
  • openpyxl.utils.column_index_from_string -> 会把字母转化为数字。
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string
...
print('列转换函数:')
print('[数字转换为字母]')
print('第 1 列 -> ' + get_column_letter(1))
print('第 2 列 -> ' + get_column_letter(2))
print('第 37 列 -> ' + get_column_letter(37))
print('第 818 列 -> ' + get_column_letter(818))
print('[字母转换为数字]')
print('第 A 列 -> ' + str(column_index_from_string('A')))
print('第 CC 列 -> ' + str(column_index_from_string('CC')))

运行结果:

[数字转换为字母] 第 1 列 -> A 第 2 列 -> B 第 37 列 -> AK 第 818 列 -> AEL [字母转换为数字] 第 A 列 -> 1 第 CC 列 -> 81

3.6 切片

我们可以对 Worksheet 对象切片,取得表格中的一个矩形区域,迭代遍历这个区域中的所有 Cell 对象。

print(tuple(active_sheet['A2':'D4']))
for row_objects in active_sheet['A2':'D4']:
  for cell_object in row_objects:
    print(cell_object.coordinate, cell_object.value)
  print('-- 当前行获取结束 --')

运行结果:

((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.D2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>), (<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.D4>)) A2 1 B2 中国 C2 13.83亿人(2016) D2 9634057 -- 当前行获取结束 -- A3 2 B3 印度 C3 1339180127 D3 2973190 -- 当前行获取结束 -- A4 3 B4 美国 C4 324459463 D4 9147420 -- 当前行获取结束 --
  • 这里首先通过 tuple() 方法,展示出了切片后的所有 Cell 对象。
  • 然后使用了两个 for 循环,外层 for 循环会遍历这个切片中的每一行;而内层 for 循环会遍历该行中的每个单元格。

 3.7 获取指定行或指定列

我们可以使用 Worksheet 对象的 rows 和 columns 属性,来获取指定行或者列:

print('获取特定行:')
print(list(active_sheet.rows)[2])
for cell_object in list(active_sheet.rows)[2]:
  print(cell_object.value)

print('获取特定列:')
print(list(active_sheet.columns)[2])
for cell_object in list(active_sheet.columns)[2]:
  print(cell_object.value)

运行结果:

获取特定行: (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>) 2 印度 1339180127 2973190 获取特定列: (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.C5>, <Cell 'Sheet1'.C6>, <Cell 'Sheet1'.C7>, <Cell 'Sheet1'.C8>, <Cell 'Sheet1'.C9>, <Cell 'Sheet1'.C10>, <Cell 'Sheet1'.C11>) 人口 13.83亿人(2016) 1339180127 324459463 263991379 209288278 197015955 190886311 164669751 143989754 129163276

  • Worksheet 对象的 rows 或者 columns 属性,都会返回一个由 “行元组” 构成的元组。每个行元组都拥有该行中的所有 Cell 对象。
  • 可以通过行元组的下标,来访问具体的 Cell 对象。

读取 Excel 步骤,总结如下:

  • 导入 openpyxl 模块。调用 openpyxl.load_workbook() 函数,加载 excel 文档,获取 Workbook 对象。
  • 调用 workbook#active 或 workbook[${sheet_name}],获取 sheet 工作簿。
  • 传入 row 和 column 关键字参数并调用索引或工作表的 cell() 方法,获取 Cell 对象。
  • 有了 Cell 对象,就可以执行具体的业务逻辑咯。

总结

以上所述是小编给大家介绍的python 的 openpyxl模块 读取 Excel文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
Python yield与实现方法代码分析
Feb 06 Python
python实现电脑自动关机
Jun 20 Python
基于python实现简单日历
Jul 28 Python
python验证码图片处理(二值化)
Nov 01 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
Python requests接口测试实现代码
Sep 08 Python
Python绘制数码晶体管日期
Feb 19 Python
 python中的元类metaclass详情
May 30 Python
pymysql模块的使用(增删改查)详解
Sep 09 #Python
Django之模板层的实现代码
Sep 09 #Python
Django模板语言 Tags使用详解
Sep 09 #Python
Python中turtle库的使用实例
Sep 09 #Python
Django之路由层的实现
Sep 09 #Python
python中web框架的自定义创建
Sep 08 #Python
python web框架中实现原生分页
Sep 08 #Python
You might like
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
php调整服务器时间的方法
2015/04/03 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
python实现排序算法解析
2018/09/08 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
学校安全生产月活动总结
2014/07/05 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
采购内勤岗位职责
2015/04/13 职场文书
2015年纪念“卢沟桥事变”78周年活动方案
2015/05/06 职场文书
离职证明格式样本
2015/06/12 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python