1 import xlrd,re 2 from datetime import datetime 3 from xlrd import xldate_as_tuple 4 5 6 # 判斷上傳表格是否與模板要求一致 7 def checkExcel(path,field_attr): 8 #1.打開當前excel表格 9 data = xlrd.open_workbook(path) 10 now_table = data.sheet_by_index(0) 11 #當前表格的行數 12 rows_numn = now_table.nrows 13 14 #2.1驗證長度 15 table_index = now_table.row_values(0) 16 if len(field_attr) != len(table_index): 17 return False,'表格行數應為{0}行'.format(len(field_attr)) 18 else: 19 #2.2驗證內容 20 flag = True 21 msg = '' 22 for k in range(1, rows_numn): 23 # 2.2.1驗證內容12,13是否馬滿足時間格式%y-%m-%d %H 24 start_time = now_table.cell(k,12) 25 end_time = now_table.cell(k,13) 26 pattern = r"(\d{4}-\d{2}-\d{1,2}\s\d{2})" 27 if re.match(pattern,start_time) == None: 28 flag = False 29 msg += '第{0}行第{1}列格式用為 2018-01-01 00 格式'.format(k,12+1) 30 if re.match(pattern,end_time) == None: 31 flag = False 32 msg += '第{0}行第{1}列格式用為 2018-01-01 00 格式'.format(k,13+1) 33 if len(msg) >=100: 34 msg += '.....' 35 break 36 return flag, msg 37 38 39 40 #數據庫表添加一條數據的方法 41 def addObj(obj): 42 pass#不同數據實現方法不一樣 43 44 45 46 #將表格數據插入數據庫 path上傳表格路徑 field_attr值表格行數對應字段如{0:'name',1:'age',2:'sex'} 47 def exportExcel(path,field_attr): 48 #1.檢查表格 49 flag,msg = checkExcel(path,field_attr) 50 if not flag: 51 return msg 52 else:#通過驗證 53 # 2.讀取excel 54 data = xlrd.open_workbook(path) 55 now_table = data.sheet_by_index(0) 56 # 獲得當前表格的行數 57 rows_numn = now_table.nrows 58 # 將當前的sheet插入到數據庫 59 for k in range(1, rows_numn): 60 row_vlaue = now_table.row_values(k) 61 obj = {} 62 # 處理要插入的數據,把非字符串的數據轉換成字符串類型,同事將字符串變成 sql語句需要的類型 63 64 for a in range(0, len(row_vlaue)): 65 ctype = now_table.cell(k, a).ctype 66 # ctype: 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error 67 if ctype == 1: 68 row_vlaue[a] = row_vlaue[a].replace("'","/'") 69 if ctype == 2 and row_vlaue[a] % 1 == 0: 70 tmp = int(row_vlaue[a]) 71 row_vlaue[a] = str(tmp) 72 if ctype == 3: 73 d = datetime(*xldate_as_tuple(row_vlaue[a], 0)) 74 row_vlaue[a] = d.strftime('%Y-%m-%d %H') 75 obj[field_attr[a]] = row_vlaue[a] 76 #3.將該行數據插入數據庫 77 try: 78 addObj(obj) 79 except: 80 return '第{0}行數據插入失敗'.format(k) 81 return 'ok'
支持.xlsx結尾的excel文件