xlrd会把xls文件中比如20160--03-01类型的时间转换成整数,那么我们如何保证xlrd读取进来的时间为2016-03-01格式呢?
使用xlrd中的xldate_as_tuple函数
代码如下:
from datetime import datetime
from xlrd import xldate_as_tuple
datetime(*xldate_as_tuple(table.cell(2,2).value,0))
str(datetime(*xldate_as_tuple(table.cell(2,2).value,0)))[0:10]#取字符串的前十,例如结果为2016-06-01 00:00:00 则为2016-06-01
完整导入数据代码:
#coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.settings") ''' Django 版本大于等于1.7的时候,需要加上下面两句 import django django.setup() 否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. ''' import django if django.VERSION >= (1, 7):#自动判断版本 django.setup() from contract.models import Bill import xlrd #excel读工具 from datetime import datetime from xlrd import xldate_as_tuple data= xlrd.open_workbook('DEMO.xlsx') #打开文件 table = data.sheet_by_index(0) #获取工作表 nrows = table.nrows #行数 ncols = table.ncols #列数 colnames = table.row_values(0) WorkList = [] x = y = z = 0 for i in range(1,nrows): row = table.row_values(i) #获取每行值 for j in range(0,ncols): if type(row[j]) == float: #如果值为float则转换为int,避免出现1输出为1.0的情况 row[j] = int(row[j]) if row: #查看行值是否为空 if Bill.objects.filter(contract_code = row[0]).exists():#判断该行值是否在数据库中重复 x = x + 1 #重复值计数 else: y = y + 1 #非重复计数 row[3] = str(datetime(*xldate_as_tuple(row[3],0)))[0:10]#xlrd读取xls文件时间整数值转换为date形式 row[4] = str(datetime(*xldate_as_tuple(row[4],0)))[0:10] row[5] = str(datetime(*xldate_as_tuple(row[5],0)))[0:10] WorkList.append(Bill(contract_code=row[0], contract_name=row[1], cust_name=row[2], con_sign_date=row[3], con_eff_date=row[4], con_exp_date=row[5],con_state=row[6], con_age=row[7], con_type=row[8], con_agent=row[9],new_flag=row[10],original_code=row[11],payment=row[12] ) ) else: z = z + 1 #空行值计数 Bill.objects.bulk_create(WorkList) print '数据导入成功,导入'+str(x)+'条,重复'+str(y)+'条,有'+str(z)+'行为空!'