|
解决问题点
: W5 b) f3 c* O) z/ k: j拿到一个产品的BOM,有许多位号对应的原材料品番。
) J1 V3 ?' J4 b
1 D1 k3 K, i" D: n0 P k买材料的时候需要一个材料对应几个位号,但是生产核对的时候核对的是位号对应的品番,下面实现的好几种位号的BOM,拆分成一个位号对应一个品番,方便核对。
5 q. p+ k7 D( L$ P$ g x) x: t) _
& W7 V7 }. p/ x2 X+ }: H6 h a1 }8 Z5 `处理之前: b6 t2 o2 M4 t3 J0 Z: U! k
[table][tr][td=1,1,109]品番[/td][td=1,1,72]使用数量[/td][td=1,1,274]位号[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C357,370,374-376,383-385,387-389[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C14,15,131,221-223,235-237,241,242[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C12,13,88,90,92,96,100,103,104[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C111,112,115,117,119,121,122,130[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C132,218-220,230-234,245,246[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C257-280,290-304,307-310,317-321$ V2 |2 Q) G9 g- w9 Q, s4 I x2 `
7 |0 I3 Q C* F% t2 b& v- E) ~
处理之后0 @) Q; U6 F" [6 x/ ]' n
[table][tr][td=1,1,72]品番[/td][td=1,1,72]使用数量[/td][td=1,1,72]位号[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C357[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C370[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C374[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C375[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C376[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C383[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C384[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C385[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C387[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C388[/td][/tr][tr][td]品番1[/td][td]11[/td][td]C389[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C14[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C15[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C131[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C221[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C222[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C223[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C235[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C236[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C237[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C241[/td][/tr][tr][td]品番2[/td][td]11[/td][td]C242[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C12[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C13[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C88[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C90[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C92[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C96[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C100[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C103[/td][/tr][tr][td]品番3[/td][td]9[/td][td]C104[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C111[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C112[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C115[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C117[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C119[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C121[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C122[/td][/tr][tr][td]品番4[/td][td]8[/td][td]C130[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C132[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C218[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C219[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C220[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C230[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C231[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C232[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C233[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C234[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C245[/td][/tr][tr][td]品番5[/td][td]11[/td][td]C246[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C257[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C258[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C259[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C260[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C261[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C262[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C263[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C264[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C265[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C266[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C267[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C268[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C269[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C270[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C271[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C272[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C273[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C274[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C275[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C276[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C277[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C278[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C279[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C280[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C290[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C291[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C292[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C293[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C294[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C295[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C296[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C297[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C298[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C299[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C300[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C301[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C302[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C303[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C304[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C307[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C308[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C309[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C310[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C317[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C318[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C319[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C320[/td][/tr][tr][td]品番6[/td][td]48[/td][td]C3211 U6 |6 d7 Z" U5 [' j
如果大家觉得使用,可以点赞收藏,不好用也希望提下改善建议。+ ^5 I8 d& E% M4 F) r/ m
测试运行环境:3 ^3 A) d. x. r3 D9 S% v5 z
python版本 :python 3.7$ P5 D; |/ F9 {
IDE:Pycharm2022.1.1
4 H" Z4 a: n q3 @% W3 e- F模块使用:os,re,openpyxl,tkinter# i9 p% U" ?1 m! S
" [( E, B/ V2 P' \0 P B
源码:初次发表,源码如下:- r; W: R; u; i( v) \$ \/ C$ f+ v
# -*- coding:utf-8 -*-+ o! ^0 j% t: V* ~. P; C l
"""
' X, A% B: Z, ^2 G f( g' G# @File : excel数据拆分.py1 k# g, E% y9 a) C! r
# @Author:chen5 b( e! `: W. h* p3 U' g) ~
# @Date : 2024/1/5
) N) e9 |( A d# @Desc :
3 Q; {( \' Y4 b C3 J"""3 J$ Y& e6 [1 m- g2 G; z7 y# A
import re' R! F$ Z0 c% Y/ H$ p) w6 t
import os$ K# Y; s+ |6 D& k0 m
from tkinter import filedialog
! M* w9 |4 ~" a: J$ Z$ afrom openpyxl import load_workbook
& E# J1 h9 d7 Y* ~, V- o* k* K$ h x) [& h2 F1 D+ ]% @
# 定义文件夹路径
1 }# d8 O$ G! i# folder_path = os.path.dirname(os.path.abspath(__file__))/ N1 E* F6 S7 G4 i& n9 n0 C
data_dir = filedialog.askdirectory(title='请选择文件夹') + '/'* l5 D: L; q; i' ^9 p' U
" s" ~3 I1 m/ } F" l
# 列出文件夹中的所有文件和文件夹
( O" d6 H' L6 dfiles = os.listdir(data_dir)
" w! l# h* C% y8 u0 f6 t; k! f4 {
' m6 i G8 J/ r" `% T2 c/ X' _# 遍历文件列表,筛选出文件名* g8 E" A! W' m4 h2 l1 u! O/ b5 H
file_names = [file for file in files if os.path.isfile(os.path.join(data_dir, file))]0 s' k/ }8 ]! H7 w2 z4 @8 C( h
print("需要处理的文件名:", file_names)
& U- C# u/ |2 z/ V a/ T! j A
* J" ]: F, \; e! d( L% @& b
# z+ ~- A7 s$ q! O1 N3 |% rdef parse(data):' E* f2 T$ I; v8 @
list1 = []
- [5 ?) m* ^4 }' Q# X f, D if ',' in data[2]:$ b1 x( H: z7 M9 v7 F: t7 \
list2 = data[2].split(',')
3 D- g' o z% w: l" \+ [" t # print(list2)
- O3 I8 x$ y4 U6 I # print("*"*90)& D' f7 c1 R' J" E7 q, ]# O3 Z
list1 = [i for i in list2 if i is not '']( Q( z- S1 O$ R; B( _
# print(list1)' T% l' m* |. @" M( b& i# s( X
elif ' ' in data[2]:9 e0 q7 a5 s, d
list2 = data[2].split(' ')1 v6 { e8 x5 w' M
# print(list2)
, S! S$ g* o" [3 f; \/ M # print("*"*90)4 Y$ _. d3 s! |! ?) [- Y9 I* Z
list1 = [i for i in list2 if i is not '']4 I7 n6 V( B4 {# c& r
else:3 ~ v$ ]+ e+ Y- \
list1 = [data[2]]$ o. Q' D& n% h0 @/ U
# print(list1)
! R8 P g6 z* U* l- I9 s: ~/ f3 ?2 L/ ?
# 针对第一个字母的多个回路改进 C300-335,350-405,407,268-275,5208 `+ z! \, j# S
# 问题点 回路没有字母的需要判断一下3 ^- O" T- h* r0 P
new_list = []
- N5 `% T& X1 C8 K; ^+ Z O first_id = list1[0]* z) s a0 s9 ]) L4 A
if first_id.isdigit(): # 判断回路是不是纯数字组成6 n, B% K( I6 Q3 Q2 v. g- `7 b
first_id_str = ''
+ R: Q* y9 M# {% g& F2 c$ p) b else:
; ~/ V3 h. P ]1 G first_id_str = re.findall(r'[a-zA-Z]+', first_id)[0]7 l, S" Z0 _. B7 J1 a
2 s: S; v* N8 Q9 c! X: `* p # 添加代替品" v5 K, o7 L* N/ C
pa = ''
$ x. M! E4 a5 X0 ? if len(data) >= 4:. c, T% E8 u9 E# r8 C
pa = data[3]
% Q8 }, X( m: W8 T0 U6 j: U$ `/ s) D1 F! z9 P- t, }5 \4 Y
for i in list1:0 s F0 X+ W8 Q( R+ f: u+ H0 e' s7 t
if '-' in i:/ s4 c l+ u+ K% f, W% A1 c
print("带-或空格的回路开始分解")% \2 w" b( G8 p: ]
item = i.split('-')
8 _" ^5 a* G4 T. l. m& U* u$ j( z/ x item_start = item[0]# A% O2 x! f5 l3 j! b
item_end = item[-1]
3 `8 u8 S1 K# u- K item_str = re.findall(r'[a-zA-Z]+', item_start)
" B4 M/ T7 Q4 E! V& A if item_str:
8 M0 k1 u5 W+ P. s/ N9 U" O" g item_str = item_str[0]* p( X; W0 C% E% d) n
else:; t* u' a: m3 ^1 N6 I
item_str = first_id_str
9 k3 d* \$ ~0 A- _- [" @ data_num = re.findall(r"\d+", item_start)
A# N5 l; X0 u$ i Y item_start_num = int(data_num[0])/ r0 j7 f6 p- G/ E& T/ x
item_end_num = int(re.findall(r"\d+", item_end)[0])
3 d1 u. U, ^0 b
: y' N+ H3 L, D* E. [0 s for a in range(item_start_num, item_end_num + 1):
+ n- u. A3 A, K3 A7 \ c = item_str + str(a). D, H3 l" b: v# z
/ J: l2 [/ |% J
new_list.append([data[0], data[1], c, pa])$ m+ \: X) }& E- z
# print(item_str,item_start_num,item_end_num)
7 R5 G/ H1 s9 ^7 @+ o else:
5 E/ o" A/ G5 h5 B3 D# d. ^ x% `& W if i.isdigit():
5 j3 |- A1 K3 o8 l! Q c = first_id_str + i" h4 G& z5 g" r& U+ q4 W" v9 P
new_list.append([data[0], data[1], c, pa])
R2 E% g; b1 |( Y5 Z" l6 t else:
! m& }6 y7 _1 O7 |# q( ~8 X new_list.append([data[0], data[1], i, pa])
* M$ o4 S+ ?5 S+ N& A print(new_list)
; E ]" S8 f6 S$ O return new_list6 c9 N. O3 N$ o6 I$ @6 H
4 \" {; k& ^8 [2 J/ w$ X$ E) O
6 T" |# k. O( D5 {8 Adef parse_data():
0 j6 m4 l6 r/ q6 f for name in file_names:
5 a8 t7 S$ ~8 Z9 X print(name)3 ^/ ?$ \/ A l. ], ]7 h
if '.xls' in name:4 c# \. G% f/ M f
wb = load_workbook(data_dir + name)2 L5 d/ w+ d" [" f+ }( |0 ^9 F
# print(data_dir+name)
& }. f+ O- b; l2 p$ ?4 B sheet = wb.active
" g% g H7 Q/ J! n2 S; A sheet_data = [], Q' q j% m' m; d" C) T0 w- A
for rows in sheet:
! C3 }, F) h; o- L, E row_list = []
, l3 ~3 F" g+ b5 ]3 v. s9 U for cell in rows:* Y& K% k9 v9 d
row_list.append(cell.value)
2 Y5 I3 b+ n$ B& k9 [& M sheet_data.append(row_list)+ B0 \, b! m: {$ {8 J; O
# print(sheet_data)
( t! u0 j: L7 Z5 V: h4 _) J* P
new_sheet_data = []
. ?9 ^: h% D; p5 k8 e7 Z for items in sheet_data:
: x _. Z8 K9 E& M if items[2] == None:7 O O( O6 N( J. p% T: ? k8 _
continue3 A) s0 I/ A( ?! z# t/ a
data = items[2]
* n8 d1 Z3 s& C9 y6 U if ',' in data or '-' in data or " " in data:
* m7 E0 E+ j3 l, Q2 d O& I0 D new_list = parse(items)3 { K; `9 {; A, Y$ j3 U, L; _
for parse_list in new_list:
3 w0 c+ y( e0 g2 T1 q new_sheet_data.append(parse_list)
: F. b) S2 n$ y# ^5 v) R0 d" Z # print(new_list), J. \* P/ Q4 d0 M
9 u; t ]% I, W8 F% N4 `$ J else:( K& ~) y) o3 A2 z
new_sheet_data.append(items)3 Q" G% n* N& H* Z! |* H8 }' O o8 T
# print(new_sheet_data)& V9 L3 P2 x4 j" _: W
sheet2 = wb.create_sheet("new_sheet")7 m( |: w( _/ i9 B2 k
print("创建新的sheet完成,sheet名:new_sheet")
d; h ?8 F# z6 q. r2 W4 C for d in new_sheet_data:
4 B) ~2 ]! U$ \" L: P( u( d; C if isinstance(d, list):
+ l( a5 z7 x/ H9 y T2 o sheet2.append(d)3 }; {5 n& ^/ ~3 ?1 w7 @
else:
! Q$ ]2 O) a7 C, \4 O* m5 q. n print(d, "格式不对-->", type(d)); ]8 {2 Q- ^3 _2 E" H1 ~' O5 H
wb.save(data_dir + name)
& g. _, C6 L, `& H( Q: H0 n wb.close()3 ^$ r6 B/ e, R$ U7 b7 o: }; c
print("分解完成"); c. z0 H+ b# i$ U; m
0 E2 Q6 X, z. s7 S3 }- L9 a8 y: b2 \
5 s9 S- j' T5 b- p7 k- s% _" Pif __name__ == '__main__':( Z' z, d% T) T) L8 l
parse_data()) r2 a9 z9 w. Q
- O$ s0 C p% [: T/ ^
; V8 {2 F. D' I' q/ O9 Z- A! p" E8 C
6 G! U5 D$ I$ B) x5 i x- Z# B3 y侵权联系与免责声明1、本站资源所有言论和图片纯属用户个人意见,与本论坛立场无关
?. T9 W: B) C* c* S3 {2、本站所有资源收集于互联网,由用户分享,该帖子作者与瑞客论坛不享有任何版权,如有侵权请联系本站删除. B6 a) T( t# o# X
3、本站部分内容转载自其它网站,但并不代表本站赞同其观点和对其真实性负责
( ^8 ]5 Y, g$ e& M8 W P* G, W4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意 H' |7 K. ^( B" u
如有侵权联系邮箱:ruikelink@gmai.com
+ i0 R! k, n* f+ Q4 Z k$ \ M/ L资源下载地址和密码(百度云盘): [/hide] 百度网盘信息回帖可见
2 Z3 |5 {8 u% _9 j N# l! B/ F7 g* m7 u; h
# }. L& R8 w3 \( R5 l) Q
$ p+ R! y, \) o$ R* b
本资源由Java自学网收集整理【www.javazx.com】 |
|