需要从一份原始数据中,抓取相应的行列,然后放置到另一份目标表单中。我选择了前段时间写过的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()