1.前言大家好,今天给大家介绍一下我拿的第一份Python单。我只用了不到2小时就完成了这份清单。首先,我收到这个单子的时候的想法是对Excel表进行处理,建立两个表之间的关系,通过项目需求修改Excel表中的数据。我是用面向过程的方式写的,每一步都放在不同的函数中。下面介绍一下我是如何通过自己的思考一步步完成的。一、客户的需求:二、代码实现及说明1、模块导入主要用到的模块有openpyxl和random:importopenpyxlimportrandomfromopenpyxl.utils.cellimportget_column_letter,column_index_from_stringopenpyxl中除了openpyxl和random之外也用到了utils包下的cell模块的两个方法,第一个方法get_column_letter是将整数转成excel中对应列属性的字符串,例如:12转成L,50转成AX第二个方法是convert字符串到整数的转换类似于十进制到27的转换,当然你也可以自己写。下面附上自己写的行(整数)转列(字符串)的代码。:defnum_to_string(n):column=n-1real_colum=''whilecolumn>=26:value=column//26column=column%26real_colum+=chr(value+64)real_colum+=chr(column+65)返回real_colum2。获取“原始数据表”中的数据#创建全局变量MATERIAL_MESSAGEMATERIAL_MESSAGE=[]#获取小玩中的数据defget_construct_message():#读取原始数据表.xlsxtablewb=openpyxl.load_workbook('dataoriginalTable.xlsx')#获取当前激活的工作表,默认为第一个表ws=wb.active#获取生产记录update.xlsx中可以使用的数据,存入MATERIAL_MESSAGEforrowinrange(1,ws.max_row+1):如果ws[f'A{row}'].value=='date':foriinrange(ord('B'),ord('I')):material=[]#将日期转换成生产记录对应的形式updatedate=ws[f'B{row}'].value.translate(str.maketrans('year-month','--'))date=date.replace('number','')material.append(date)i=chr(i)material.append(ws[f'{i}{row+1}'].value)material.append(ws[f'{i}{row+3}'].value)MATERIAL_MESSAGE.append(material)print(MATERIAL_MESSAGE)3.获取生产记录更新表中的日期和材料#将客户需要的相应数据存入字典MediumTABLES={"cement":"cement1","flyash":"coalash","riversand":"砂1","粗骨料1":"石1","粗骨料2":"石2","减水剂":"外加剂","水":"水"}#日期和生产记录更新表存储的行号DATE=[]#StoreinproductionRecord更新表的物料及其在列数MATERIAL=[]wb=openpyxl.load_workbook('生产记录更新.xlsx')ws=wb.active#Getdatedefget_date():forrowinrange(3,ws.max_row+1):#将日期拆分合并成MATERIAL_MESSAGE中日期对应的格式date=str(ws[f'B{row}'].value).split()[0]date_list=date.split('-')if'0'indate_list[1]:date_list[1]=date_list[1].replace('0','')如果'0'在date_list[2]中:date_list[2]=date_list[2].replace('0','')date='-'.join(date_list)DATE.append([date,row])pprint.pprint(DATE)#获取材料defget_material():n=0forcolumninws[1]:n+=1#判断单元格内容是否在TABLES中ifcolumn.valueinTABLES.values():#使用rowand列转换方法MATERIAL.append([column.value,get_column_letter(n-1)])pprint.pprint(MATERIAL)DATE表部分数据:MATERIAL表数据:4.修改生产数据更新表中的数据#二参数是材质类型和列数defupdate_default(matrial,letter):forrowinrange(3,ws.max_row+1):#判断单元格是否为空ifws[f'{letter}{row}'].value!=None:foriinrange(len(MATERIAL_MESSAGE)):#需求条件,使两个表中的日期和材料类型一一对应ifDATE[row-3][0]==MATERIAL_MESSAGE[i][0]andmatrial==TABLES[MATERIAL_MESSAGE[i][1]]:#修改t的设置值形参字母ws[f'{letter}{DATE[row-3][1]}'].value=MATERIAL_MESSAGE[i][2]对应的列所需的每个符号对应的单元格#获取列号后面两列对应的列号letter_random=get_column_letter(column_index_from_string(letter)+2)letter_real=get_column_letter(column_index_from_string(letter)+1)#判断该列是否在这三列中,如果在其中,取-2到2之间的随机数,否则取-1到1之间的随机数,更新error值ifletterin('AV','BB','BE'):ws[f'{letter_random}{DATE[row-3][1]}'].value=round(random.uniform(-2,2),1)else:ws[f'{letter_random}{DATE[row-3][1]}'].value=round(random.uniform(-1,1),1)#用设定值和误差值更新中间实际值ws[f'{letter_real}{DATE[row-3][1]}'].value=round(ws[f'{letter}{DATE[row-3][1]}'].value*(1+ws[f'{letter_random}{DATE[row-3][1]}'].value*0.01),2)5.最后调用函数保存数据defmain():get_construct_message()get_date()get_material()foriinMATERIAL:update_default(i[0],i[1])wb.save('Productionrecordupdate.xlsx')if__name__=="__main__":main()三、效果展示修改前的部分数据:修改后的部分数据:4.最后,经过我两个小时的努力,我完成了这个列表。总体来说,难点不在于在如何修改数据中,讲的是如何将两个表相互连接起来。通过这个命令,我可以更加熟练地操作excel表。接单不仅可以提高我的能力,还可以赚点外快。何乐而不为呢?做吗?
