借助openpyxl处理excel
一次处理excel中,原计划是借助excel中自带的工具进行处理,然而看到需要处理的列要达到30+,后来放弃了,用Python处理或许是一个不错的选择。
需求:
表格中每一列数据都是一个随机值,但是已知该列对应的标准区间,eg:20<x<40是正常区间,超出这一区间就是非正常区间,需要将落在正常区间的数据标记为0,落在非正常区间的数据标记为1。另外还有一种情况,eg:x<50是正常区间,超过50就是非法区间。
我的数据字典放在了sheet2中,首先去读取sheet2中的标准:
def readSheet2(ExcelFullName): wb = load_workbook(ExcelFullName) sheets = wb.sheetnames print (sheets) mysheet = sheets[1] #获取sheet2的信息 ws = wb[mysheet] for i in range(2,29): mydata[ws.cell(row=i, column=1).value] = ws.cell(row=i, column=3).value print (mydata)
读出的标准放在了字典中:
{'AST': '15-40', 'ALT': '9-50', 'GGT': '10-60', 'ALP': '45-125', 'ALB': '40-55', 'TB': '3.5-23.5', 'DB': '0.5-6.5', 'IB': '1.0-17', 'XT': '3.9-6.3', 'GYSZ': '0.4-1.8', 'DGC': '3.6-6.2', 'GMDZDB': '0.8-1.5', 'DMDZDB': '0.5-3.36', 'PT': '11.0-14.0', 'NXMYHDD': '70-50', 'WBC': '3.5-9.5', 'RBC': '4.3-5.8', 'HB': '130-175', 'PLT': '125-350', 'BDL': '0-20', 'HBsAg': '<1.0', 'HBsAb': '<10.0', 'HBeAg': '<1.0', 'HBeAb': '>1.0', 'HBcAb': '>1.0', 'AFP': '0-20', 'PIVK': '0-40'}
使用上面读出的标准对sheet1的数据进行处理。
# 按照sheet2的信息逐列处理sheet1 def readSheet1(ExcelFullName): wb = load_workbook(ExcelFullName) sheets = wb.sheetnames mysheet = sheets[0] # 获取sheet1的信息 ws = wb[mysheet] for i in range(27, 56): if ws.cell(row=1, column=i).value in mydata: #print(i) print(ws.cell(row=1, column=i).value) str = mydata[ws.cell(row=1, column=i).value] if str[0]!='<' and str[0]!='>': str = mydata[ws.cell(row=1, column=i).value] str1 = str.split('-') a = float(str1[0]) b = float(str1[1]) #c = a + b #print(c) for j in range(2,218): if ws.cell(row=j, column=i).value != None: if float(ws.cell(row=j, column=i).value) >=a and float(ws.cell(row=j, column=i).value) <=b: ws.cell(row=j, column=i).value = 0 else: ws.cell(row=j, column=i).value = 1 else: op = str[0] opnum = float(str[1:]) #print(opnum) if op == '<': for j in range(2, 218): if ws.cell(row=j, column=i).value != None: if float(ws.cell(row=j, column=i).value) < opnum: ws.cell(row=j, column=i).value = 0 else: ws.cell(row=j, column=i).value = 1 else: for j in range(2, 218): if ws.cell(row=j, column=i).value != None: if float(ws.cell(row=j, column=i).value) > opnum: ws.cell(row=j, column=i).value = 0 else: ws.cell(row=j, column=i).value = 1 wb.save('balances.xlsx')
上述是两种处理方式,最后将数据保存在balances.xlsx文件中。
主函数如下:
if __name__ == '__main__': # 需进行两次读excel与一次写excel excelPath = "C:/Users/Halo/Desktop/ml/" excelName = "info.xlsx" ExcelFullName= os.path.join(excelPath,excelName) # 存储sheet2中的信息,用于后续比较 # mydata = {'AST': '15-40', 'ALT': '9-50', 'GGT': '10-60', 'ALP': '45-125', 'ALB': '40-55', 'TB': '3.5-23.5', 'DB': '0.5-6.5', 'IB': '1.0-17', 'XT': '3.9-6.3', 'GYSZ': '0.4-1.8', 'DGC': '3.6-6.2', 'GMDZDB': '0.8-1.5', 'DMDZDB': '0.5-3.36', 'PT': '11.0-14.0', 'NXMYHDD': '70-50', 'WBC': '3.5-9.5', 'RBC': '4.3-5.8', 'HB': '130-175', 'PLT': '125-350', 'BDL': '0-20', 'HBsAg': '<1.0', 'HBsAb': '<10.0', 'HBeAg': '<1.0', 'HBeAb': '>1.0', 'HBcAb': '>1.0', 'AFP': '0-20', 'PIVK': '0-40'} # 1.读取sheet2中需要处理的参数 readSheet2(ExcelFullName) # 2.读取根据Sheet2中内容找到Sheet1中对应的列中的内容并进行处理 readSheet1(ExcelFullName)
后续再进行补充。