操作目的: 通过对比两个EXCEL表格 对比数据 相同部分和不同部分区分开来 并生成新的EXCEL 两者表格形式如下 原理是通过读取B表格的参数编号和申报内容作为字典,在A表格中对应的进行查询 是否相同并作出标识
先说第一版使用openxyl做的代码 一地板openxyl写的代码本身没有问题 也很快 定位也很简单 但是有个致命性的问题 他不支持XLS文件格式
然后尝试了第二版的pandas 做代码导入 我说下pandas遇到的问题 其中比较难理解的是out of range的问题 相对于openxyl pandas是在读取文件的时间预先选定好文件的范围,比如4*4 那么超过这个范围的第5行你就选择不到 就会报这个错误 但是openxyl则不会有这个问题 openxyl相当于在一个excel的副本上进行操作 没有范围限制
其中还有一个pandas目前无法解决的问题 如果文件中出现N/A这个字符串时 他会默认识别为Nan 不会当做字符串而是空进行识别 这个也是我为什么会尝试第三种方法的原因 但Pandas的读取范围确实比openxyl要大 再说下xlrd 和xlwt的问题 相对于前面两种方式 他们的操作性好在于他的操作模式 相当于是复制了一个副本进行操作,如果某一个值不满意直接变更掉就可以了 但是xlrd则不是这样 他是对于EXCEL的直接操作,我这里是想要输出一个副本,那么操作起来就麻烦了不少 需要先读 对比 然后循环输出 就不是更改完后一把输出的模式 但是好处是他不会将N/A读错,字符串之间的转换也没有问题 对于写入来说 是有限将需要写入的字段拼成一个字符组 循环写入那一行 然后通过FILE输出 得到的效果和前面是一样的
row=df.index.size
d = dict()
for i in range(0, row):
lp = df.loc[i][1]
np = df.loc[i][2]
if not lp is None :
d[df.loc[i][0]] = df.loc[i][2]
row2 = df2.index.size
col_name = df2.columns.tolist()
col_name.insert(6,'状态')
df3=df2.reindex(columns=col_name)
for i in range(0, row2):
lp = df3.loc[i][1]
if not lp is None:
if d.get(df3.loc[i][0]) == df3.loc[i][5]:
df3.iloc[i,4] = df3.loc[i][5]
else:
df3.iloc[i,4] = d.get(df3.loc[i][0])
df3.iloc[i,6]='数据异常'
a = os.path.basename(selectFileName1)
b = a.split('.')[0]
writer=pd.ExcelWriter('./'+b+'.xlsx')
df3.to_excel(writer)
writer.save()
writer.close()
result = tkinter.messagebox.showwarning(title='执行成功', message='文件已生成')
print (result)
df3.to_excel(selectFileName1,sheet_name='备案参数')
在贴下 xlrd的代码
import pandas as pd
import tkinter
from tkinter import *
import tkinter.filedialog
import tkinter.messagebox
import os
import xlrd
import xlwt
def upload_files():
global selectFileName
selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')
p.set(selectFileName)
global df
df = pd.read_excel(selectFileName)
def upload_files1():
global selectFileName1
selectFileName1 = tkinter.filedialog.askopenfilename(title='选择文件')
f.set(selectFileName1)
global df2
df2 = pd.read_excel(selectFileName1,sheet_name='备案参数')
def zh26():
data = xlrd.open_workbook(selectFileName1)
table = data.sheets()[1]
nrows = table.nrows
d=dict()
for i in range(1, nrows):
d[table.cell_value(i, 0)]=table.cell_value(i, 5)
data2=xlrd.open_workbook(selectFileName)
table2=data2.sheets()[0]
nrows2=table2.nrows
file = xlwt.Workbook()
table3 = file.add_sheet('info', cell_overwrite_ok=True)
rowX=table3.row(0)
spam = ['参数编号', '参数名称', '原参数申报内容','参数申报内容','状态']
for i in range(0, 5):
rowX.write(i, spam[i])
for i in range(1,nrows2):
rowX = table3.row(i)
lp = table2.cell_value(i, 0)
if not lp is None:
if d.get(lp)==table2.cell_value(i, 2):
spam = [lp,table2.cell_value(i, 1),table2.cell_value(i, 2),table2.cell_value(i, 2)]
for t in range(0, 4):
rowX.write(t, spam[t])
else:
spam = [lp, table2.cell_value(i, 1), table2.cell_value(i, 2), d.get(lp),'参数不同']
for t in range(0, 5):
rowX.write(t, spam[t])
a = os.path.basename(selectFileName1)
b = a.split('.')[0]
file.save('./'+b+'.xls')
class LoginScreen():
root = Tk()
root.title("参数对比")
global p
p = StringVar()
global f
f = StringVar()
b_pwd = Button(root, text='选择数据源', command=upload_files)
b_pwd.grid(row=1, column=0, sticky=E)
bt_pwd = Entry(root, textvariable=p)
bt_pwd.grid(row=1, column=1, sticky=E)
b_pwd = Button(root, text='选择数据源2', command=upload_files1)
b_pwd.grid(row=1, column=2, sticky=E)
bt_pwd = Entry(root, textvariable=f)
bt_pwd.grid(row=1, column=3, sticky=E)
bt_pwd = Button(root, text='对比', command=zh26)
bt_pwd.grid(row=2, column=0, sticky=W)
root.mainloop()
if __name__ == '__main__':
LoginScreen()
|