Python3 筛选、比对excel表内容

老婆最近接了一个单子,帮人比对员工工资,拿了几份Excel表回来。

表格大体上是这样子的。每个月一份表格,每个表格里按区域分成多个工作簿,每个区域按部门排列员工的姓名与工资,当然还有很多细节,被我省略了。

要求比对两个月份的表格,找到其中工资有变化的人。

我的办法是先筛选数据,存入字典中,然后进行比对。

分析表格,每个名字的左边都有序号,右边有工资,都是数字。而标题行和合计都只有文字。所以筛选名字只要判断名字左右两边是不是都是数字。然后将名字和对应的工资存在列表里,再将这两个列表存在一个字典中。字典的键是所在区域,字典的值是包含姓名列表和工资列表的复合列表。

因为考虑到名字可能有重复,所以名字和工资单独保存在各自的列表里,而不是直接用一个字典保存名字和工资。

下面上代码。主要用到了xlrd模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import xlrd
 
#全局变量
dictList = []
workbookList = []
result = []
num = 0
 
 
#判断是否为数字
def isShuzi(string):
	if '.' in string:
		return True
	elif string.isdigit():
		return True
	else:
		return False
 
#存入字典的方法
def cunRuZiDian(sheet,count):
	global num
	global dictList
	nameList = []
	salaryList = []
	for row in range(0,sheet.nrows):
		if isShuzi(str(sheet.cell(row,0).value)) and isShuzi(str(sheet.cell(row,2).value)):
			nameList.append(sheet.cell(row,1).value)
			salaryList.append(sheet.cell(row,2).value)
			num += 1
	dictList[count][sheet.name] = [nameList,salaryList]
 
def fileInput():
	global dictList
	for fileNum in range(0,2):
		workbook = xlrd.open_workbook('/Users/littlepotato/Documents/php&python/Python/bidui/{}.xls'.format(fileNum + 1))
		workbookList.append(workbook)
		dictList.append({})
 
def bidui(biduiList):
	global result
	for key in biduiList[0].keys():
		if key in biduiList[1].keys():
			for name in biduiList[1][key][0]:
				if name in biduiList[0][key][0]:
					index_0 = biduiList[0][key][0].index(name)
					index_1 = biduiList[1][key][0].index(name)
					if biduiList[0][key][1][index_0] != biduiList[1][key][1][index_1]:
						result.append([name,key,biduiList[0][key][1][index_0],biduiList[1][key][1][index_1]])
 
#主程序
fileInput()
count = 0
for workbook in workbookList:
	for sheet in workbook.sheets():
		cunRuZiDian(sheet,count) #存入数组
	count += 1
 
bidui(dictList)
print('共存入{}名员工工资状态'.format(num))
print(result)

用我的测试表来测试最后结果,如图,最后结果是比对后有问题的员工姓名、所属区域、以及两份表格中工资情况。

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注