做了一个从Excel中筛选需要的列和行;并根据内容不同放到不同的Excel中的程序

导入需要的包

1
2
3
4
5
6
7
8
9
import sys
import xlrd
import xlwt
from datetime import datetime
from xlrd import xldate_as_tuple
import tkinter
import os
from tkinter import filedialog
from tkinter import messagebox

选取Excel文件并获取文件名和文件路径

1
2
3
4
5
6
from tkinter import filedialog
tkinter.Tk().withdraw() # 使用tk选择文件时会出现一个框框,不影响使用但会看着很难受,所以将Tkinter.Tk()实例隐藏
Filepath = filedialog.askopenfilename(title=u'选择文件')#获取文件路径并将选择框标题设置为选择文件
Filename = os.path.basename(Filepath)#根据文件路径获取文件名,后边我生成新的文件需要根据选择的文件来命名
if Filepath == '':#如果弹出的文件选择框未选择就关闭会导致文件路径为空,下边的代码执行会出错,所以路径为空直接结束程序
sys.exit()

读取Excel文件

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
'''读取工作表'''
data = xlrd.open_workbook(Filepath)#根据上边的路径读取Excel文件
table = data.sheets()[0]#用索引方式获取第一个sheet
'''总行数'''
nrows = table.nrows
'''总列数'''
ncols = table.ncols


'''获取第二行的列名称'''
columnName = table.row_values(1)#excel中第二行为列名,用列表记录


'''获取需要的列的字典'''
saveColumn = ['任务号', '物料编码', '零件图号', '数量', '材质', '尺寸', '工序', '完工日期', '备料日期', '成型日期', '仓库', '定额', '工段', '组件', '外协', '批次']#需要保存的列的名称
columnNameDictionary = {}#声明一个字典来存储需要的列在excel中对应的列号
for i in range(ncols):
if columnName[i] in saveColumn:#如果第二列中的列名在需要保存的列的列表中;则将列名和列号存到字典中
columnNameDictionary[columnName[i]] = i

'''获取需要的数据列数据,去掉不需要的列数据'''
dataContent = []
for key, value in columnNameDictionary.items():#根据列名字典中列名对应的数据列去获取数据内容
dataContent.append(table.col_values(value, start_rowx=1, end_rowx=nrows))

'''去掉不需要的行数据,同时将列表存储数据的方式由列转为行'''
ncols = len(dataContent) # 列数量----更新行列值
nrows = len(dataContent[0]) # 行数量

'''需要将材质列等于——的值整行删除'''
material = 0 # 材质的列号
for i in range(nrows): # 找到材质的列号
if dataContent[i][0] == '材质':
material = i
break
finalDataContent = []#用来存储最终需要的行列数据,按行存储
for i in range(nrows):#i为行数
temp = []#暂存数据的列表
if dataContent[material][i] != '——':#如果材质不等于——则将第i行数据读出
for j in range(ncols):
temp.append(dataContent[j][i])
finalDataContent.append(temp)#将读到的数据保存
temp = []

'''更新列名字典和行列数'''
ncols = len(finalDataContent[0]) # 列数量
nrows = len(finalDataContent) # 行数量
columnNameDictionary.clear()
for i in range(ncols):
columnNameDictionary[finalDataContent[0][i]] = i

修改Excel内需要修改的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''修改数据内容;按外协厂家进行分组-----为了减少循环次数放到了一块'''
outsourcSet = set() # 创建外协集合
for i in range(nrows):
if i > 0: # 第一行为列名,从第二行开始遍历 “零件图号”列将所有字母改为小写、“.”改为“-”、“艺”改为“y”
finalDataContent[i][columnNameDictionary['零件图号']] = finalDataContent[i][columnNameDictionary['零件图号']].lower()
finalDataContent[i][columnNameDictionary['零件图号']] = finalDataContent[i][columnNameDictionary['零件图号']].replace('.', '-')
finalDataContent[i][columnNameDictionary['零件图号']] = finalDataContent[i][columnNameDictionary['零件图号']].replace('艺', 'y')
finalDataContent[i][columnNameDictionary['数量']] = int(finalDataContent[i][columnNameDictionary['数量']])
finalDataContent[i][columnNameDictionary['完工日期']] = datetime(*xldate_as_tuple(finalDataContent[i][columnNameDictionary['完工日期']], 0)).strftime('%Y-%m-%d')
finalDataContent[i][columnNameDictionary['备料日期']] = datetime(*xldate_as_tuple(finalDataContent[i][columnNameDictionary['备料日期']], 0)).strftime('%Y-%m-%d')
finalDataContent[i][columnNameDictionary['成型日期']] = datetime(*xldate_as_tuple(finalDataContent[i][columnNameDictionary['成型日期']], 0)).strftime('%Y-%m-%d')
outsourcSet.add(finalDataContent[i][columnNameDictionary['外协']])

outsourc = list(outsourcSet)#得到的分为不同文件的厂家名

str.lower()是将字符串的字母全转为小写

str.replace('艺', 'y')是将字符串的“艺”都转为“y”

finalDataContent[i][columnNameDictionary['完工日期']] = datetime(*xldate_as_tuple(finalDataContent[i][columnNameDictionary['完工日期']], 0)).strftime('%Y-%m-%d')

finalDataContent[i][columnNameDictionary['完工日期']]的 值在读取过后被转为了数值,应该展示为日期,所以使用

datetime(*xldate_as_tuple(finalDataContent[i][columnNameDictionary['完工日期']], 0)).strftime('%Y-%m-%d')

来转为日期型并重新赋值给它

data由读出来的数值转为日期的方法为datetime(*xldate_as_tuple(data, 0)).strftime('%Y-%m-%d')

将数据存储为Excel文件

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
# 设置样式
# VERT_TOP = 0x00 上端对齐
# VERT_CENTER = 0x01 居中对齐(垂直方向上)
# VERT_BOTTOM = 0x02 低端对齐
# HORZ_LEFT = 0x01 左端对齐
# HORZ_CENTER = 0x02 居中对齐(水平方向上)
# HORZ_RIGHT = 0x03 右端对齐
style = xlwt.XFStyle()
al = xlwt.Alignment()
al.horz = 0x02 # 设置水平居中
al.vert = 0x01 # 设置垂直居中
style.alignment = al
for i in range(len(outsourc)):
name = Filepath.replace('★模板★', '【' + outsourc[i] + '】')
# 创建excel文件
filename = xlwt.Workbook()
# 给工作表命名
sheet = filename.add_sheet(data.sheet_names()[0])
a = b = 0
for j in range(nrows):
style2 = xlwt.easyxf('font:height 360;') # 18pt,类型小初的字号
row = sheet.row(j)
row.set_style(style2)
if j == 0:
for k in range(ncols):
sheet.write(a, b, finalDataContent[j][k], style)
b += 1
b = 0
a += 1
else:
if finalDataContent[j][columnNameDictionary['外协']] == outsourc[i]:
finalDataContent[j][columnNameDictionary['外协']] = '外协' + finalDataContent[j][columnNameDictionary['外协']]
for k in range(ncols):
sheet.write(a, b, finalDataContent[j][k], style)
b += 1
b = 0
a += 1
'''设置每一列的宽度'''
sheet.col(0).width = 256 * 14
sheet.col(1).width = 256 * 14
sheet.col(2).width = 256 * 20
sheet.col(3).width = 256 * 5
sheet.col(4).width = 256 * 10
sheet.col(5).width = 256 * 20
sheet.col(6).width = 256 * 20
sheet.col(7).width = 256 * 14
sheet.col(8).width = 256 * 14
sheet.col(9).width = 256 * 14
sheet.col(10).width = 256 * 10
sheet.col(11).width = 256 * 10
sheet.col(12).width = 256 * 14
sheet.col(13).width = 256 * 14
sheet.col(14).width = 256 * 14
sheet.col(15).width = 256 * 20
filename.save(name)

设置单元格数据居中的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置样式
# VERT_TOP = 0x00 上端对齐
# VERT_CENTER = 0x01 居中对齐(垂直方向上)
# VERT_BOTTOM = 0x02 低端对齐
# HORZ_LEFT = 0x01 左端对齐
# HORZ_CENTER = 0x02 居中对齐(水平方向上)
# HORZ_RIGHT = 0x03 右端对齐

style = xlwt.XFStyle()
al = xlwt.Alignment()
al.horz = 0x02 # 设置水平居中
al.vert = 0x01 # 设置垂直居中
style.alignment = al
sheet.write(a, b, finalDataContent[j][k], style)#在第a行第b列填入finalDataContent[j][k]的数据,格式为style

设置单元格高度

1
2
3
style2 = xlwt.easyxf('font:height 360;')  # 18pt,类型小初的字号
row = sheet.row(j)#在写第j行的时候设置它的高度
row.set_style(style2)

设置单元格高度

1
sheet.col(0).width = 256 * 14#设置单元格第1列的宽度;256为一个字符的宽度

将数据存储为txt文件

1
2
3
4
5
6
7
8
9
10
11
12
13
for i in range(len(outsourc)):
name = Filepath.replace('★模板★.xls', '【' + outsourc[i] + '】.txt')
txtData = open(name, 'w')#以读方式打开,如果有数据会被清空
count = 0 # 记录行号
for j in range(nrows):
if j > 0:
if finalDataContent[j][columnNameDictionary['外协']] == '外协' + outsourc[i]:
if count != 0:#如果不是第一行则先加换行再输出;需求最后没有空行,最后不能换行,所以换行在写每一行之前
print('', file=txtData)#print打印会默认换行,所以直接打印空字符
count += 1
for k in range(ncols):
print(finalDataContent[j][k], end='\t', file=txtData)#写入每个数据后用制表符分隔
txtData.close()#关闭文件对象

完成后弹出提示框

1
messagebox.showinfo("提示", "文件分解完成")

打包文件

安装pyinstallerpip install pyinstaller

打包pyinstaller -F -w PlansToBreakUp.py

需要在文件在目录下运行

-w是去掉运行时的黑框