Python利用xlrd库读取xls文件

写在前面

  1. xlrd只支持xls文件,并不支持xlsx文件,需要操作xlsx文件需要使用openpyxl库

  2. xlrd只支持读取xls文件,不支持修改xls文件,需要修改则使用xlwt库或者xlutils库

  3. 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

image-20260428203126443

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

learn_xlrd · 南风丶轻语/python-learning-notes - 码云 - 开源中国

posted @ 2026-04-29 16:24  南风丶轻语  阅读(42)  评论(0)    收藏  举报