Excel表格在我们日常办公中是不可或缺的,学会用python处理excel表格对我们工作效率会有很大提升。python提供的xlrd模块其实并不好用,它会有容量限制,我发现了一个比较好用的模块——openpyxl,它的容量大,而且简单易用。接下来我就讲一下它的一些常用的基本操作。
Excel 文件也称做为工作簿。每个工作簿可以包含多个工作表(Sheet)。用户当前查看的表或关闭 Excel 前最后查看的表,称为活动表。
每一张表都是由列和行构成的。列是以 A 开始的字母表示;而行是以 1 开始的数字表示的。由特定行和列所指定的方格称为单元格。每个单元格都可以包含一个数字或文本。这些单元格就构成了这张表。
通过 pip 就可以安装最新版的 openpyxl。
pip install openpyxl
假设有这样一份世界人口统计 Excel 文档,内容如下:
3.1 加载
导入 openpyxl 模块之后,就可以使用 openpyxl.load_workbook() 函数来加载 Excel 文档咯。这个 Excel 文件表示为 Workbook 对象。
wb = openpyxl.load_workbook('population.xlsx')
print('wb 类型 :')
print(type(wb))
运行结果:
wb 类型 :
<class 'openpyxl.workbook.workbook.Workbook'>
注意:load_workbook()
函数中的文件,必须在当前工作目录。可以导入 os 模块,利用 os.getcwd() 来获悉当前工作目录。os 还提供了 chdir() 方法,可以改变当前工作目录。
import os
print('当前工作目录 :')
print(os.getcwd())
...
print('取得所有工作表的表名 :')
print(wb.sheetnames)
print('取得某张工作表 :')
sheet = wb['Sheet3']
print(type(sheet))
print('表名 - ' + sheet.title)
print('取得活动工作表 :')
active_sheet = wb.active
print('表名 - ' + active_sheet.title)
运行结果:
取得所有工作表的表名 :
['Sheet1', 'Sheet2', 'Sheet3']
取得某张工作表 :
<class 'openpyxl.worksheet.worksheet.Worksheet'>
表名 - Sheet3
取得活动工作表 :
表名 - Sheet1
3.3 读取单元格(Cell)
可以通过单元格的名字(比如:A1)来获取 Cell 对象。
...
print('取得 A1 单元格 :')
cell = active_sheet['A1']
print(cell)
print(cell.value)
print('取得 B1 单元格 :')
cell = active_sheet['B1']
print(cell)
print(cell.value)
print('行号为 ' + str(cell.row) + ',列号为 ' + str(cell.column) + ' 的单元格,其值为 ' + cell.value)
print('单元格 ' + cell.coordinate + ' 其值为 ' + cell.value)
print('取得 C1 单元格的值 :')
print(active_sheet['C1'].value)
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)
运行结果:
取得 A1 单元格 :
<Cell 'Sheet1'.A1>
排名
取得 B1 单元格 :
<Cell 'Sheet1'.B1>
国家
行号为 1,列号为 2 的单元格,其值为 国家
单元格 B1 其值为 国家
取得 C1 单元格的值 :
人口
通过指定行与列,来获取单元格:
<Cell 'Sheet1'.B1>
国家
迭代行与列,来获取单元格的值:
1 国家
3 印度
5 印度尼西亚
7 巴基斯坦
3.4 获取工作表大小
Worksheet 对象的 max_row 与 max_column,可以获取工作表的总行数与总列数,即工作表的大小。
print('获取工作表的大小:')
print('总行数 -> ' + str(active_sheet.max_row))
print('总列数 -> ' + str(active_sheet.max_column))
运行结果:
获取工作表的大小: 总行数 -> 11 总列数 -> 4
3.5 列转换函数
openpyxl 提供了两个函数,用于转换列号:
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
-- 当前行获取结束 --
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
data = open('./data.txt', 'r')
outwb = openpyxl.Workbook() # 打开一个将写的文件
outws = outwb.create_sheet(index=0) # 在将写的文件创建sheet
i = 1 # 注意:'cell'函数中行列起始值为1
for line in data:
for x in range(0,len(line)):
outws.cell(column = x+1 , row = i , value = "%s" % line[x])
i += 1
savexlsx = "./results.xlsx"
outwb.save(savexlsx) # 保存结果
data.close()
转载:(1)说说如何使用 python 的 openpyxl 读取 Excel
(2)解决ValueError: row index was 65536, not allowed by .xls format