[python] xlrd操作Excel以及处理日期

更多xlrd、xlwt、openpyxl
基础
xlrd、xlwt

1、导入模块

import xlrd

2、打开文件

data = xlrd.open_workbook("data.xlsx")

3、获取sheet:

x1.sheet_names():获取所有sheet名字
x1.nsheets:获取sheet数量
x1.sheets():获取所有sheet对象
一般使用下列两种方法:
x1.sheet_by_name("test”):通过sheet名查找
x1.sheet_by_index(1):通过索引查找

4、获取sheet的汇总数据:

sheet.name:获取sheet名
sheet.nrows:获取总行数
sheet.ncols:获取总列数

5、单元格批量读取:

a、行操作:

sheet.row_values(0)  # 获取第一行所有内容,合并单元格,首行显示值,其它为空。
sheet.row(0)           # 获取单元格值类型和内容
sheet.row_types(0)   # 获取单元格数据类型

b、表操作

sheet.row_values(0, 6, 10)   # 取第1行,第6~10列(不含第10表)
sheet.col_values(0, 0, 5)    # 取第1列,第0~5行(不含第5行)
sheet.row_slice(2, 0, 2)     # 获取单元格值类型和内容
sheet.row_types(1, 0, 2)   # 获取单元格数据类型

6、特定单元格读取:

a、 获取单元格值:

sheet.cell_value(1, 2)
sheet.cell(1, 2).value
sheet.row(1)[2].value 

b、 获取单元格类型:

sheet.cell(1, 2).ctype
sheet.cell_type(1, 2)
sheet.row(1)[2].ctype

7、(0,0)转换A1:

xlrd.cellname(0, 0)   # (0,0)转换成A1
xlrd.cellnameabs(0, 0) # (0,0)转换成$A$1
xlrd.colname(30)  # 把列由数字转换为字母表示
例:
import xlrd
import os

filename = "demo.xlsx"
filePath = os.path.join(os.getcwd(), filename)
# 打开文件
x1 = xlrd.open_workbook(filePath)
sheet1 = x1.sheet_by_name("plan")
# (0,0)转换成A1
print (xlrd.cellname(0, 0)   # (0,0)转换成A1
print xlrd.cellnameabs(0, 0) # (0,0)转换成$A$1
print xlrd.colname(30)  # 把列由数字转换为字母表示

8、数据类型:

得到ctype的两种方法:
worksheet.cell_type(row_index, col_index)
worksheet.cell(i, j).ctype

空:0
字符串:1
数字:2
日期:3
布尔:4
error:5

问题

处理时间日期问题,xlrd遇到时间格式会转换为float类型,数字比较短,很明显不是时间戳,需要用xlrd的xldate_as_tuple将数据转换为一个6个元素的tuple,这样我们可以通过datetime构造日期类型,需要注意的是,这里仅限于日期,如果单单是时间格式,在year,month,day上的元素分别为0,这样会导致datetime out of range异常报错,在处理时间时,我的解决方法一般是判断这个是日期格式还是只有时间,如果是时间,将这个tuple例如(0,0,0,9,0,0)str 后,可以通过生成式[-3:]取切片,通过 : join之后,成为:“9:0:0”,通过字符串time.strptime转换为struct_time类型,再通过strftime转换为标准时间格式。

在遇到整数类型的表数据,也需要ctype判断下是否为2,然后int一下。

worksheet = ...
ctype = worksheet.cell_type(row_index, col_index)
if ctype == 2 and cell % 1 == 0:  # 如果是整形
	cell = int(cell)
elif ctype == 3:	#datetime类型
	cell = worksheet.cell_value(row_index, col_index)
	date = datetime(*xldate_as_tuple(cell, 0))	#0从1900,1从1904位基准,通常为0
    cell = date.strftime('%Y/%d/%m %H:%M:%S')


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moke丶青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值