有些时候,我们并不能用程序直接读取电脑内的表格数据[权限设置或文档加密]
这个时候,复制后进行操作就是一个比较便利的折中方式
整个脚本实现起来非常简单
1.读取复制到剪切板的数据
2.解析数据
3.进行操作,可以是对比或其他你喜欢的
4.返回结果
import win32clipboard as wc
import win32api
import time
import re
import os #导入os模块
import os.path #导入os.path模块
import xlrd #导入第三方库xlrd
import sys
#获取粘贴板里的内容
def getCopyTxet():
zidian={}
input('复制内容后回车:')
wc.OpenClipboard()
A = str(wc.GetClipboardData())
wc.CloseClipboard()
B = re.split(r'\n',str(A))
for b in B:
c = re.split(r'\t|\r',str(b))
if len(c) >4:
zidian[str(c[0])]=[str(c[2]),str(c[3])]
return zidian
#把表格字典转化成表格样式的一整个字符串 返回字符串
def write_excel(A): #创建一个转换字典为特定字符表的函数
for B,C in A.items(): #遍历表字典内的行:列键值对
Hang = int(len(A)) #获得行数
Lie = int(len(C)) #获得列数
Lie_Biao = [] #创建中转列:值对的列表
Zuizhong = [] #创建最终所有列值对字符串列表
for hhh in A.values(): #遍历表中的列字典
for lll in hhh.values(): #遍历列字典的值
Lie_Biao.append(str(lll)) #把值字符串化添加到值列表
for hangshu in range(0, Hang + 1): #定义行数为跳转步长
guodu = Lie_Biao[hangshu * Lie:hangshu * Lie + Lie] #定义按每行转化成过渡切片
jiange_1 = '\t' #定义一个制表符
meiyihang = jiange_1.join(guodu) #用制表符来连接切片中的每一列
Zuizhong.append(meiyihang) #把由每一列连起来的每一行添加到最终列表
jiange_2 = '\n' #定义一个换行符
zhenggebiao = jiange_2.join(Zuizhong) #用换行符来连接最终列表内每个行元素
return zhenggebiao #返回一个表示整个表的字符串
#把特定的字符串写入特定路径按特定名和格式保存
def save_excel(mistake,wenjianjialujing,baocunming,geshihouzhui):
baocunming = str(baocunming) #指定保存名
LUJING_NEW = wenjianjialujing + '\\' + baocunming + '.'+ geshihouzhui #拼装最终路径
f = open(LUJING_NEW, 'w',encoding='utf-8') # 在目的路径声明一个文件及格式并打开
f.write(mistake) # 把处理好的信息写入这个文件
f.close() # 关闭写入操作
A = getCopyTxet()
B = getCopyTxet()
#print(A)
#1.汇总所有的料号
mistake = {}
mistake_name = []
for a,b in A.items():
mistake[a]=''
for a,b in B.items():
mistake[a]=''
for a,b in mistake.items():
mistake_name.append(str(a))
#创建输出数据体
takeout={}
for i in range(0,len(mistake_name)):
x = mistake_name[i]
if x in A and x in B:
one = re.split(r',',str(A[x][0]))
one.sort()
one = one +[str(A[x][1])]
two = re.split(r',',str(B[x][0]))
two.sort()
two =two +[str(B[x][1])]
if len(one) != len(two):
takeout['第' + str(i) + '行'] = {}
takeout['第' + str(i) + '行']['第' + str(1) + '列'] = str(x)
takeout['第' + str(i) + '行']['第' + str(2) + '列'] = str(A[x][0])+ '\t' + str(A[x][1]) + '\t' + str(B[x][0])+ '\t' + str(B[x][1])
else:
for z in range(0,len(one)):
if one[z] != two[z]:
takeout['第'+str(i)+'行'] = {}
takeout['第' + str(i) + '行']['第' + str(1) + '列'] = str(x)
takeout['第'+str(i)+'行']['第'+str(2)+'列']= str(A[x][0])+ '\t' + str(A[x][1]) + '\t' + str(B[x][0])+ '\t' + str(B[x][1])
elif x in A and x not in B:
takeout['第'+str(i)+'行'] = {}
takeout['第' + str(i) + '行']['第' + str(1) + '列'] = str(x)
takeout['第'+str(i)+'行']['第'+str(2)+'列']= str(A[x][0])+ '\t' + str(A[x][1]) + '\t' + str('第二次数据没有找到!')+ '\t' + str('第二次数据没有找到!')
elif x not in A and x in B:
takeout['第'+str(i)+'行'] = {}
takeout['第' + str(i) + '行']['第' + str(1) + '列'] = str(x)
takeout['第'+str(i)+'行']['第'+str(2)+'列']=str('第一次数据没有找到')+'\t'+str('第一次数据没有找到')+'\t'+str(B[x][0])+'\t'+str(B[x][1])
if takeout == {}:
input('没有误差!Enter结束程序!')
else:
path=input('输入保存路径:')
BOM_mistake = str(write_excel(takeout))
save_excel(BOM_mistake,path,'BOMmistake','xlsx')
input('误差结果已返回源文件夹!Enter结束程序!')