美文网首页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