一 xlrd基础知识
- 载入xlrd模块,并将excel表格导入
import xlrd
data = xlrd.open_workbook('../表格.xls') # 打开表格
names = data.sheet_names() # 返回表格中所有表格的名字
table = data.sheets()[0] # 将表格的第一个sheet存入table变量
-
对于表格的简单读取
其中,x代表行序号,y代表列序号,均是从零开始的非负整数。
cell1 = table.cell_value(x,y) # 返回单元格的值
row1 = table.row_values(x) # 返回某一行的元素列表
col1 = table.col_values(y) # 返回某一列的元素列表
cell2 = table.row_values(x)[y]
cell3 = table.col_values(y)[x]
# 该两行与第一行代码等效,即cell1、cell2与cell内容完全相同
-
可能存在的问题
报错:Excel xlsx file; not supported
原因:xlrd模块在1.2.0之后的版本不支持xlsx格式,仅支持xls格式。
解决方案:
1)卸载当前版本的xlrd模块,安装早于1.2.0的版本;
2)将xlsx格式的excel文件另存为xls格式。
二 利用xldate处理日期
-
有关excel中日期格式的单元格
1)实际上以 浮点数 的形式存储在单元格中,并不存在“日期”的数据类型;
2)存在一个 时间基准(datemode) ,不同的时间基准加上浮点数得到的实际日期不同。在一些函数的参数中,0 代表1900-01-01为基准,1 代表1904-01-01为基准,通常WIndows使用前者,Mac使用后者。
-
将以浮点数形式存在的日期数据转换为可读的形式
1)xlrd.xldate_as_tuple(xldate,datemode) 函数
参数 xldate:要处理的单元格值(或浮点数)
参数 datemode:时间基准
返回值:返回元组(year,month,day,hour,minute,nearest_second)2)xlrd.xldate.xldate_as_datetime(xldate,datemode) 函数
参数 xldate:要处理的单元格值(或浮点数)
参数 datemode:时间基准
返回值:datetime对象,格式 year-month-day hour:minute:second
*注:excel的date对象与datetime对象不是同一概念,前者仅仅以 浮点数 的形式存在,并不存在相关的函数或参数,关于后者可以查阅相关的文档说明,在此处不再赘述。
3)
题外话:关于datetime对象的显示
import xlrd
data = xlrd.open_workbook('../【更新】新闻宣传业务领域志愿者赛时每日到岗、运行情况统计表.xls') # 打开表格
table = data.sheets()[0] # 将表格的第一个sheet存入table变量
dt = xlrd.xldate_as_datetime(table.cell_value(56,3),0)
# 用1900年为时间基准,将第0行第3列的单元格值转换为datetime对象
print(type(dt))
print(dt)
print(dt.strftime("%Y/%m/%d"))
print(dt.strftime("%y/%m/%d"))
print(dt.strftime("%x %X"))
print(dt.strftime("%c"))
# 根据一定的格式打印
运行结果如下:
日期显示格式与对应的含义:
格式 | 含义 | 备注 |
---|---|---|
%y | 年份的后两位数字 | |
%Y | 四位完整的年份 | |
%j | 该日期是一年当中的第几天 | 范围在001-366之间 |
%m | 月份 | |
%b | 简写英文月份 | |
%B | 完整英文月份 | |
%d | 返回是该月的第几日 | |
%H | 小时 | 24小时制 |
%I | 小时 | 12小时制 |
%p | 上午或下午 | AM或者PM |
%M | 分钟 | |
%S | 秒钟 | |
%x | 日期 | 日/月/年(注意顺序与习惯相反) |
%X | 时间 | 时:分:秒 |
%c | 详细日期时间 |
-
将可读形式的日期转换为浮点数(即excel date)
1)xlrd.xldate.xldate_from_date_tuple(date_tuple, datemode) 函数
参数date_tuple:上面第2点的(1)返回值形式的日期元组
参数datemode:时间基准
返回值:浮点数
import xlrd
data = xlrd.open_workbook('../统计表.xls')
table = data.sheets()[0]
t = xlrd.xldate_as_tuple(table.cell_value(56,3),0) # 由单元格引入的元组
t1 = xlrd.xldate_as_tuple(44619.0,0) # 直接由浮点数引入的元组
a = xlrd.xldate.xldate_from_datetime_tuple(t,0) # 将元组逆处理得到浮点数
print(t)
print(t1)
print(a)
print(type(a))
运行结果如下,注意前后浮点数的对照与呼应: