美文网首页Python学习内容整理
openpyxl 和pandas实践练习

openpyxl 和pandas实践练习

作者: Lorence | 来源:发表于2020-02-12 08:42 被阅读0次

    需要从一份原始数据中,抓取相应的行列,然后放置到另一份目标表单中。我选择了前段时间写过的openpyxl和pandas作为练习使用。
    原始数据中全新的数据JR才需要复制到目标表单中,因此我需要做个判断,读取原始数据JR列的所有内容data['eJR No&Link'],
    再读取目标表单中已有的JR列的所有内容
    jrs=data_in_JR[['J.R.编号']].drop_duplicates()
    然后很笨的用了For 循环去遍历原始数据JR列,判断它里面的数据是否存在于目标列jrs中。

    for new_jr in data['eJR No&Link']:
            if new_jr not in jrs.values and new_jr !="nan": #判断新JR是否存在总表中
    

    然而在excel单元格数据赋值中,我又遇到了问题。。一开始我把语句写成这样:
    ws[owner_loc].value=data[data['eJR No&Link']==new_jr]['JROwnerProfile']
    发现赋值到excel单元格中的内容带有整个数据的类型等信息,不是我想要的单一内容信息。也尝试过在语句后面加上.value,还是不行。
    后来观察下,当做一个字符串的组合,用join方法把整个字符串接起来。
    ws[owner_loc].value="".join(data[data['eJR No&Link']==new_jr]['JROwnerProfile'])
    对某些列又可以达到目的,但某些列也还是出问题。
    尤其改列值为单一数字或日期的。所以会看到我的代码中出现了三种赋值写法。。。。后续需要改进这个问题,看如何简单的完成赋值语句。


    完整代码如下:

    import tkinter as tk
    from tkinter import filedialog
    from openpyxl import Workbook
    from openpyxl import load_workbook
    import pandas as pd
    import time
    
    def getfile(): #获得从SharePoint下载下来的JR原始报表
        root=tk.Tk()
        root.withdraw()
        #Folderpath=filedialog.askdirectory() #获得选择好的文件夹
        Filepath=filedialog.askopenfilename() #获得选择好的文件的路径
        return Filepath #返回文件路径
    
    def MoveData():
        filelink=getfile() ##获得从SharePoint下载下来的JR原始报表
        time_start=time.time()
        print("努力搬数据中,请稍等。。。。。。")
        target_link="C:\\Users\\lorencecheng\\Desktop\\JR Report\\New Report.xlsx"  #JR总表的位置
    
        df=pd.read_excel(str(filelink)) #读取JR原始报表
        data=df[['eJR No&Link','Tooling/Fixture Name','Qty','Reason of Application','ModelNo','TLANo','Product Phase',\
                'Product Type','AssemblingStation','JROwnerProfile','Priority','Floor','Requested Dept','Requested by',\
                    'Submitted Date','Required Date']] #提取这些有用的表单
        data=data.dropna()
        data_in_JR=pd.read_excel(str(target_link),sheet_name="All") #打开JR总表
        jrs=data_in_JR[['J.R.编号']].drop_duplicates() #读取JR总表中的所有JR号码
        wb=load_workbook(target_link)
        ws=wb["All"]
        for new_jr in data['eJR No&Link']:
            if new_jr not in jrs.values and new_jr !="nan": #判断新JR是否存在总表中
                maxrow=len(ws['B']) #获取JR总表的最后一行
                #定义各列的位置
                jr_loc="B"+str(maxrow+1)  #JR
                owner_loc="C"+str(maxrow+1) #JR Owner
                cost_loc="D"+str(maxrow+1) # Cost center
                des_loc="E"+str(maxrow+1)  #描述
                mod_loc="F"+str(maxrow+1) # model
                tla_loc="G"+str(maxrow+1)  #TLA PN
                pri_loc="H"+str(maxrow+1)  #优先级
                qty_loc="K"+str(maxrow+1)  #数量
                floor_loc="L"+str(maxrow+1)  #楼层
                station_loc="M"+str(maxrow+1)  #工位
                phase_loc="N"+str(maxrow+1)  #阶段
                requestor="O"+str(maxrow+1) #提出者
                submit_date_loc="P"+str(maxrow+1)  #提交日期
                require_date_loc="Q"+str(maxrow+1)  #要求完成日期
                
                ws.cell(row=maxrow+1,column=1).value=ws.cell(row=maxrow,column=1).value+1
                ws[jr_loc].value=new_jr #把JR写入总表
                ws[owner_loc].value="".join(data[data['eJR No&Link']==new_jr]['JROwnerProfile'])
                ws[cost_loc].value="".join(data[data['eJR No&Link']==new_jr]['Requested Dept'])
                ws[des_loc].value="".join(data[data['eJR No&Link']==new_jr]['Tooling/Fixture Name'])
                ws[mod_loc].value="".join(data[data['eJR No&Link']==new_jr]['ModelNo'])
                ws[tla_loc].value="".join(data[data['eJR No&Link']==new_jr]['TLANo'])
                ws[pri_loc].value=data[data['eJR No&Link']==new_jr]['Priority'].values[0]
                ws[qty_loc].value=data[data['eJR No&Link']==new_jr]['Qty'].values[0]
                ws[floor_loc].value="".join(data[data['eJR No&Link']==new_jr]['Floor'])
                ws[station_loc].value="".join(data[data['eJR No&Link']==new_jr]['AssemblingStation'])
                ws[phase_loc].value="".join(data[data['eJR No&Link']==new_jr]['Product Phase'])
                ws[requestor].value="".join(data[data['eJR No&Link']==new_jr]['Requested by'])
                ws[submit_date_loc].value=str(data[data['eJR No&Link']==new_jr]['Submitted Date'].values[0])
                ws[require_date_loc].value=str(data[data['eJR No&Link']==new_jr]['Required Date'].values[0])[0:10]
    
        wb.save(target_link)
        print("数据处理完成")
        time_end=time.time()
        print('用时:',time_end-time_start,'s')
        time.sleep(30)
    
    MoveData()
    

    相关文章

      网友评论

        本文标题:openpyxl 和pandas实践练习

        本文链接:https://www.haomeiwen.com/subject/ynrqfhtx.html