【python办公自动化(6)】python打开及读取Excel表格内容

模块的介绍和安装

openpyxl模块

可以读取和写入Excel文件;需要单独安装;不包含在python标准库里;可以处理Excel数据、公式、样式,在表格里面插入图表等

pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

在windows系统下使用此条指令进行第三方库的安装省时间,Mac端直接使用pip3 install 模块名

Excle表格术语

列: column,以字母表示,在表格的上方

行: row,以数字表示,但是注意这里是从1开始,在表格的左侧

表单: sheet,在表格的下部

打开Excel表格并获取表格名称

load_workbook(filename = 表格文件路径);workbook.sheetnames 获取表格文件内的sheet名称

注意:只能打开存在的表格,不能用该方法创建一个新表格文件

import os
os.chdir('C:\\Users\\86177\\Desktop')

from openpyxl import load_workbook

workbook = load_workbook(filename= '阿里云天池电商婴儿用户数据.xlsx')
print(workbook.sheetnames)

–> 输出结果为:[’(sample)sam_tianchi_mum_baby_tr’]

通过sheet名称获取表格

workbook[sheet名称]

sheet = workbook['(sample)sam_tianchi_mum_baby_tr']

获得Excel里面的sheet之后就可以对表格的数据进行操作。比如:获取表格的尺寸大小;第一行第一列的数据,代码如下

print(sheet.dimensions) 
cell = sheet['A1']
print(cell.value) 

–> 输出结果为:

A1:G1002

user_id

如果只有Excel中只有一个sheet,那么可以直接使用.active

sheet = workbook.active
cell = sheet['B5']
print(cell.value)

–> 输出结果为:12515996043

获取某个格子的行数、列数、坐标

.row/.column/.coordinate

cell = sheet['A1']
print(cell.row, cell.column, cell.coordinate)

–> 输出结果为:1 1 A1

指定具体的行数和列数的格子

sheet.cell(row = 行数, column = 列数)

cell = sheet.cell(row = 1, column = 1)
print(cell.row, cell.column, cell.coordinate)

–> 输出结果为:1 1 A1

获取一系列格子

比如:sheet[‘A’]/sheet[5],字符就是列,数字就是行

cell1 = sheet['A']
cell2 = sheet[2]
print(cell1, cell2)

–> 输出结果为:
在这里插入图片描述

指定行和列的范围

按行获取

.iter_rows(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数)

for row in sheet.iter_rows(min_row=2, max_row=3, min_col= 1,max_col=2):
    print(row)

–> 输出结果为:

(<Cell ‘(sample)sam_tianchi_mum_baby_tr’.A2>, <Cell ‘(sample)sam_tianchi_mum_baby_tr’.B2>)

(<Cell ‘(sample)sam_tianchi_mum_baby_tr’.A3>, <Cell ‘(sample)sam_tianchi_mum_baby_tr’.B3>)

按列获取

.iter_cols(min_row = 最低行数,max_row = 最高行数,min_col = 最低列数,max_col = 最高列数)

for col in sheet.iter_cols(min_row=2, max_row=3, min_col= 1,max_col=2):
    print(col)

–> 输出结果为:

(<Cell ‘(sample)sam_tianchi_mum_baby_tr’.A2>, <Cell ‘(sample)sam_tianchi_mum_baby_tr’.A3>)

(<Cell ‘(sample)sam_tianchi_mum_baby_tr’.B2>, <Cell ‘(sample)sam_tianchi_mum_baby_tr’.B3>)

迭代整个表格的所有行

.rows

for row in sheet.rows:
    print(row)
迭代整个表格的所有列

.columns

for col in sheet.columns:
    print(col)

注意这里和上面的区别,迭代全部的行和列的字符都是全拼,但是行的复数单词的rows,所以简写,全拼是一样的

综合应用

编写一个python程序,要求:

(1)打开文件阿里云天池电商婴儿用户数据.xlsx

(2)找到其中空的格子

(3)输出这些格子的坐标,如A1,C10

第一步:查看数据维度,确定数据尺寸大小

先查看数据的尺寸大小,空格子(缺失数据)自然要在数据的尺寸大小之中,如果超出这个范围那就全是空格子了,没有研究意义,所以只考虑的是数据尺寸大小内的空格子
参考代码答案如下:

import os
os.chdir('C:\\Users\\86177\\Desktop')

from openpyxl import load_workbook
workbook = load_workbook(filename= '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
data_size = sheet.dimensions
print(data_size) 

–> 输出结果为 A1:G1002

第二步:确定数据遍历的起始和终止位置

思路:借鉴 cell = sheet[‘B5’] ,print(cell.value),也就是通过字符和数字的组合来遍历表中的全部数据,然后再判断是否为空值,随后返回对应的格子坐标。需要确定数据遍历的起始和终止位置

size_ls = data_size.split(":")
col_min,row_min,col_max,row_max = size_ls[0][0],size_ls[0][1],size_ls[1][0],size_ls[1][1:]
print(col_min,row_min,col_max,row_max)

–> 输出结果为:A 1 G 1002

第三步:英文字符和数字之间的转化,输出空格子的坐标

根据上面有关于Excel相关术语可知,列的标签是A-G,行的标签是1-1002,实现行的遍历很简单,但是实现字符A-G的遍历就需要一点功夫,这里需要知道一个知识点(英文字符和数字的转换的问题)

ord(字符) 该方法是将字符转化为数字,比如print(ord(‘A’)) --> 输出结果为65

chr(数字) 该方就是将数字转化为字符,比如print(chr(65)) --> 输出结果为A

数字转化为英文字符,生成A-G的序列(一般使用方式):
ls = []
for i in range(65,72):
    ls.append(chr(i))
print(ls)
数字转化为英文字符,生成A-G的序列(进阶方式):
ls = [chr(x) for x in range(65,72)]
print(ls)

–> 输出结果都为:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’]

英文字符转化为数字,生成65-71的序列
lt = []
for i in ls:
    lt.append(ord(i))
print(lt)

–> 输出结果都为:[65, 66, 67, 68, 69, 70, 71]

none_ls = []
for col in range(ord(col_min),ord(col_max)+1):
    for row in range(int(row_min), int(row_max)+1):
        if sheet[chr(col)+str(row)].value == None:
            #print(chr(col)+str(row))
            none_ls.append(chr(col)+str(row))
for i in none_ls:
    print(i, end=" ")
print("\n\nfinished!")

–> 输出结果都为:A278 A610 A1002 B342 B527 B958 B1002 C320 C590 C1002 D1002 E153 E278 E293 E503 E544 E666 E791 E816 E916 E1002 F554 F611 G339 G597 G976 G1002

全部代码及输出结果见下图:
在这里插入图片描述

小结

这种思路的难点在于如何实现从A-G之间的遍历,而for i in range(),range()里面只能是int类型,所以就必须想办法将英文字符与数字对应起来,就可以使用python的内置函数ord(字符)和chr(数字)。关于打开文件和判断是否是空格子(cell对应的value是否为None),逻辑上较为简单。

发布了20 篇原创文章 · 获赞 4 · 访问量 1980

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/104045839
今日推荐