#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Date:2022/07/25 14:57:23 ''' import time import json import uuid import datetime from string import ascii_uppercase from openpyxl import load_workbook class ReadExcel: def __init__(self, excelName): self.wb = load_workbook(excelName) self.ws = self.wb.active self.template_list = [] def read(self): max_lines = self.ws.max_row if self.ws['C1'].value == 'template_content': for key in range(2, max_lines + 1): value = self.ws['{}'.format('C' + str(key))].value self.template_list.append(value) return self.template_list elif self.ws['A1'].value == '申购单编号' and self.ws['B1'].value == '采购单编号': drug_list = [] # lineIndex = 0 try: for line in range(2, max_lines + 1): # 局部方法,传递字符和默认值返回方法调用,简化代码量 value_func = lambda x,y='': str(self.ws[f"{x}{line}"].value or y) # 声明一个字典存放每一行的数据 每遍历一次字典重置一次 drug_template_dict = { "variety_id": str(uuid.uuid1()), } key_list = [ "remark1", "remark2", "remark3", "remark4", "name", "english_name", "purity", "cas_number", "remark5", "net_weight", "net_weight_unit", "export_count", "remark6" ] # 采用列表和字母对应的两个列表,进行循环的方式写入字典,简化代码量 v_list = list("ABCDEFGHIJKLM") for i in range(len(key_list)): drug_template_dict[key_list[i]] = value_func(v_list[i]) if key_list[i] == "name" and drug_template_dict.get("name") == "": self.template_list.append(json.dumps(drug_list)) return self.template_list # 时间判断逻辑较为凌乱,采用原思路进行重写 # 定义当前时间对象 pDate = datetime.datetime.now() # 局部性时间字符串,共用 str_tim = "%Y-%m-%d %H:%M:%S" # 定义公共方法,处理时间转换 date_func = lambda x: datetime.datetime.strptime(x, str_tim) # 和原逻辑一样,简化写法 if not value_func("P"): if value_func("O"): pDate = date_func(value_func("N")) shelf_life = value_func("O", "3650") else: if value_func("N"): pDate = date_func(value_func('N'), str_tim) shelf_life = self.time_long( date_func(pDate.strftime(str_tim)), date_func(value_func("P"))) drug_template_dict["production_date"] = pDate.strftime(str_tim) drug_template_dict["shelf_life"] = shelf_life # if(not self.ws['P{}'.format(str(line))].value): # pDate = datetime.datetime.now() # if(self.ws['O{}'.format(str(line))].value): # pDate = datetime.datetime.strptime(str(self.ws['N{}'.format(str(line))].value), "%Y-%m-%d %H:%M:%S") # drug_template_dict['ProductionDate'] = pDate.strftime("%Y-%m-%d") # drug_template_dict['ShelfLife'] = str(self.ws['O{}'.format(str(line))].value or '3650') # else: # pDate = datetime.datetime.now() # if(self.ws['N{}'.format(str(line))].value): # pDate = datetime.datetime.strptime(str(self.ws['N{}'.format(str(line))].value), "%Y-%m-%d %H:%M:%S") # drug_template_dict['ProductionDate'] = pDate.strftime("%Y-%m-%d") # drug_template_dict['ShelfLife'] = self.time_long( # datetime.datetime.strptime(pDate.strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S"), datetime.datetime.strptime(str(self.ws['P{}'.format(str(line))].value), "%Y-%m-%d %H:%M:%S")) v_list1 = list("QRSTUVW") key_list1 = [ "price", "is_supervise", "remain", "manufacturer", "remark8", "remark9", "remark10" ] for x in range(len(key_list1)): ex = '' if key_list1[x] in ["price", "remain"]: ex = "0" val = value_func(v_list1[x], ex) if v_list1[x] == 'R': if val != "是": value = 0 else: value = 1 else: value = val drug_template_dict[key_list1[x]] = value drug_list.append(drug_template_dict) self.template_list.append(json.dumps(drug_list)) return self.template_list except Exception as e: raise RuntimeError('第{0}行;{1}'.format(str(line), str(e))) else: raise RuntimeError('模板格式错误!') def close(self): self.wb.close() def time_long(self, time1, time2, type="day"): """ 计算时间差 :param time1: 较小的时间(datetime类型) :param time2: 较大的时间(datetime类型) :param type: 返回结果的时间类型(暂时就是返回相差天数) :return: 相差的天数 """ da = lambda x: time.strptime(str(x), '%Y-%m-%d %H:%M:%S') if type == 'day': day_num = (int(time.mktime(da(time2))) - int(time.mktime(da(time1)))) / ( 24 * 60 * 60) return abs(int(day_num))