Python利用xlrd库读取xls文件
写在前面
-
xlrd只支持xls文件,并不支持xlsx文件,需要操作xlsx文件需要使用openpyxl库
-
xlrd只支持读取xls文件,不支持修改xls文件,需要修改则使用xlwt库或者xlutils库
-
xlrd读取xls文件中的数字时,统一按浮点数(float)读取,所以不管你 xls文件 里是 1、100、95,读出来都会变成 1.0、100.0、95.0。这是 xlrd 的默认行为,不是 bug,可以利用is_integer判断后再处理。
常用函数
导入xlrd库
import xlrd
加载xls文件
wb = xlrd.open_workbook('学生成绩汇总表.xls')
获取所有的表格
sheets = wb.sheets()
print(f'所有的表格:{sheets}')
获取所有表格的名字
sheet_names = wb.sheet_names()
print(f'所有的表格名字:{sheet_names}')
选择要操作的表格
1、通过索引获取,索引从0开始
sheet_by_index = wb.sheet_by_index(0)
print(f'通过索引获取表格:{sheet_by_index}')
2、通过【名称】获取,名称来自wb.sheet_names()
sheet_by_name = wb.sheet_by_name('表格1')
print(f'通过名称获取表格:{sheet_by_name}')
查看有多少行数据
nrows = sheet.nrows
print(f'表格名称:{sheet.name}, 行数:{nrows}')
查看有多少列数据
ncols = sheet.ncols
print(f'表格名称:{sheet.name}, 列数:{ncols}')
获取某一个单元格数据
rowx = 2 # 第几行, 从0开始
colx = 3 # 第几列, 从0开始
cell_value = sheet.cell_value(rowx, colx)
print(f'第{rowx + 1}行, 第{colx + 1}列的数据是:{cell_value}')
获取某一行的数据
rowx = 3
row_values = sheet.row_values(rowx)
print(f"第{rowx + 1}行的数据是:{row_values}")
获取某一列的数据
colx = 2
col_values = sheet.col_values(colx)
print(f"第{colx + 1}列的数据是:{col_values}")
获取所有的数据
print("所有的数据如下:")
for rowx in range(nrows):
row_values = sheet.row_values(rowx)
print(row_values)
处理日期类型的数据
有时候获取的日期类型数据,显示为一串数字,需要转成日期类型
先判断是不是日期类型,再用xlrd.xldate.xldate_as_datetime转换
rowx, colx = 2, 4
cell: Cell = sheet.cell(rowx, colx) # 返回是xlrd.sheet.Cell对象
ctype = cell.ctype
value = cell.value
print(f"第{rowx + 1}行,{colx + 1}列的数据类型是:{ctype},数据是:{value}")
datemode = 0 # 1900基准则用0;1904基准则用1
if ctype == XL_CELL_DATE: # 如果是日期类型
t: datetime.datetime = xlrd.xldate.xldate_as_datetime(value, datemode)
print(f'转为时间格式:{t}')
读取所有数据的时候就自动处理日期类型和int类型
for rowx in range(nrows):
row = sheet.row(rowx)
row_values = []
for one in row:
if one.ctype == XL_CELL_DATE:
value = xlrd.xldate.xldate_as_datetime(one.value, datemode)
value = value.strftime("%Y-%m-%d")
else:
value = one.value
# 如果是int,则保存为int类型
if isinstance(value, float) and value.is_integer():
value = int(value)
row_values.append(value)
print(row_values)
例子
1、文件:学生成绩汇总表.xls

2、代码
# 读取xls文件需要导入xlrd库
import datetime
import xlrd
from xlrd import XL_CELL_DATE
from xlrd.sheet import Cell
def main():
# 打开xls文件,不支持xlsx文件
wb = xlrd.open_workbook('学生成绩汇总表.xls')
# 获取所有的表格
sheets = wb.sheets()
print(f'所有的表格:{sheets}')
# 获取所有表格的名字
sheet_names = wb.sheet_names()
print(f'所有的表格名字:{sheet_names}')
# 选择要操作的表格 通过索引获取 索引从0开始
sheet_by_index = wb.sheet_by_index(0)
print(f'通过索引获取表格:{sheet_by_index}')
# 选择要操作的表格 通过【名称】获取
sheet_by_name = wb.sheet_by_name('表格1')
print(f'通过名称获取表格:{sheet_by_name}')
# 二者指向同一张表
print(f'二者是否同一张表:{sheet_by_index == sheet_by_name}')
# 换一个变量名指向表格
sheet = sheet_by_index
print(f"当前的表格:{sheet}")
# 查看有多少行数据
nrows = sheet.nrows
print(f'表格名称:{sheet.name}, 行数:{nrows}')
# 查看有多少列数据
ncols = sheet.ncols
print(f'表格名称:{sheet.name}, 列数:{ncols}')
# 获取某一个单元格数据
rowx = 2 # 第几行, 从0开始
colx = 3 # 第几列, 从0开始
cell_value = sheet.cell_value(rowx, colx)
print(f'第{rowx + 1}行, 第{colx + 1}列的数据是:{cell_value}')
# 获取某一行的数据
rowx = 3
row_values = sheet.row_values(rowx)
print(f"第{rowx + 1}行的数据是:{row_values}")
# 获取某一列的数据
colx = 2
col_values = sheet.col_values(colx)
print(f"第{colx + 1}列的数据是:{col_values}")
# 获取所有的数据
print("所有的数据如下:")
for rowx in range(nrows):
row_values = sheet.row_values(rowx)
print(row_values)
# 处理日期类型的数据
# 获取到日期类型数据,但是显示的是一串数字,需要转成日期类型
# 先判断是不是日期类型,再用xlrd.xldate.xldate_as_datetime转换
rowx, colx = 2, 4
cell: Cell = sheet.cell(rowx, colx) # 返回是xlrd.sheet.Cell对象
ctype = cell.ctype
value = cell.value
# 这时候看到是一个数字,例如:46013.0。而不是日期类型,需要转成日期类型
print(f"第{rowx + 1}行,{colx + 1}列的数据类型是:{ctype},数据是:{value}")
datemode = 0 # 1900基准则用0;1904基准则用1
if ctype == XL_CELL_DATE: # 如果是日期类型
t: datetime.datetime = xlrd.xldate.xldate_as_datetime(value, datemode)
print(f'转为时间格式:{t}')
# 读取所有数据的时候就自动转日期类型
for rowx in range(nrows):
row = sheet.row(rowx)
row_values = []
for one in row:
if one.ctype == XL_CELL_DATE:
value = xlrd.xldate.xldate_as_datetime(one.value, datemode)
value = value.strftime("%Y-%m-%d")
else:
value = one.value
# 如果是int,则保存为int类型
if isinstance(value, float) and value.is_integer():
value = int(value)
row_values.append(value)
print(row_values)
if __name__ == '__main__':
main()
3、gitee url

浙公网安备 33010602011771号