|
解决问题点" H6 _, @$ Z( u7 q; S1 ]) f
拿到一个产品的BOM,有许多位号对应的原材料品番。
- L0 }- p6 _; R2 ?# A( T# L
: t, S* e% h3 H4 f买材料的时候需要一个材料对应几个位号,但是生产核对的时候核对的是位号对应的品番,下面实现的好几种位号的BOM,拆分成一个位号对应一个品番,方便核对。
! N( t8 K0 t2 [0 H q% ?2 j, X9 r3 r; S% R
处理之前
# ~4 q0 d$ K) o4 d! p4 m/ F[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-3215 p% F. B j6 K; G8 _0 v2 K
& T9 O3 h! Y" H5 E% \" O* ?处理之后+ b+ h% k& c1 N4 Q+ X) d
[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]C321
, L E; {) B1 q! _" L3 {, d如果大家觉得使用,可以点赞收藏,不好用也希望提下改善建议。. Q- D* o0 _- L1 Y2 @; i* P
测试运行环境:
8 w1 I7 t6 a4 F3 z7 F+ lpython版本 :python 3.7
, } ~: j: q1 j! b4 o* MIDE:Pycharm2022.1.1
! v- E! G1 _6 Y5 m; C模块使用:os,re,openpyxl,tkinter9 P1 L @4 U$ Q8 {. \( w6 ]8 @
8 t2 m: E# l' y2 r" N源码:初次发表,源码如下:
( j6 O! w9 |& \$ I* e# -*- coding:utf-8 -*-7 `) i4 B2 e* p8 \% I* D
"""; U7 H% x) S& Q1 T6 t$ u, ]1 U
# @File : excel数据拆分.py
& q8 g2 x9 A2 _( A0 a& T# @Author:chen0 m) z+ e: Y5 T
# @Date : 2024/1/5" b! m$ f9 x: A4 M6 s& q
# @Desc :6 U' K: o* s+ k* Q. c% @5 [! a( i% n2 A
"""/ H8 v. W& U) E1 m9 R4 V
import re
* F& h N8 t# z3 t& n; }import os
' q5 i1 f' ^1 h9 L& H: |* X1 m, tfrom tkinter import filedialog
7 o& e( _0 e$ N8 W+ k) Xfrom openpyxl import load_workbook6 e9 p% \+ h+ B
- F6 X4 e" b, h" J$ `
# 定义文件夹路径
1 e* l; t( F. ~3 x. p; O# folder_path = os.path.dirname(os.path.abspath(__file__))7 o, e# t0 K8 g( G, P7 |- I
data_dir = filedialog.askdirectory(title='请选择文件夹') + '/'
v4 i$ L. H8 l5 a+ W3 q; g! C
$ }5 \5 X! L9 h4 B: e0 J# 列出文件夹中的所有文件和文件夹0 ?4 a* c8 U3 G* ^! m+ u
files = os.listdir(data_dir)
9 ^* a) G) g4 v6 j9 @7 Q8 M1 v6 a5 c9 [2 A# k! ]; k
# 遍历文件列表,筛选出文件名; d* j2 i: b; Z$ @) c
file_names = [file for file in files if os.path.isfile(os.path.join(data_dir, file))]7 S/ ]9 m! P8 f& h& _( R9 B
print("需要处理的文件名:", file_names): e4 l" N! B8 m4 R- J& N: v
2 |5 D$ I: ~* f: q4 U* E+ t
/ T6 ]- R: K. Y M e- |$ j6 _def parse(data):
$ M. k1 c" x9 ?* J list1 = []
% n$ _! |( N7 T3 k: K2 K if ',' in data[2]:
2 J) H. Z+ [" y& r list2 = data[2].split(',')
$ T- p8 N; E P8 q- V, ^: j # print(list2)( x+ w* t4 d4 _0 d
# print("*"*90)2 ?6 T7 l0 c8 P9 {+ j5 B
list1 = [i for i in list2 if i is not ''], s8 P: _8 u3 B n- l+ }9 t
# print(list1)
& O2 h- z: ]1 G4 T7 w/ i elif ' ' in data[2]:7 a( _7 o- c/ J( B* x
list2 = data[2].split(' ')
% u& w3 M9 [# J2 A$ U! I # print(list2)
1 a$ X8 m' ]. w7 Y: [ # print("*"*90). O) I6 n; f; U
list1 = [i for i in list2 if i is not '']
) G7 j: o) C" h- K+ J. q6 Q; r6 a( S9 G, { else:' U) y- @) l8 N
list1 = [data[2]]/ T3 M/ O9 H' F$ H# g9 ?" S* C
# print(list1)
2 u" ?6 g2 v5 J+ r/ b Z
e8 W8 P3 |8 M2 @0 F. W1 p # 针对第一个字母的多个回路改进 C300-335,350-405,407,268-275,520! p( O. b& h L2 r }
# 问题点 回路没有字母的需要判断一下 x: M* A1 o/ `4 Q
new_list = []3 R8 X5 `% N0 Q$ n: I5 j
first_id = list1[0]) N4 ^9 b# n3 a
if first_id.isdigit(): # 判断回路是不是纯数字组成
1 G+ p5 k3 R+ [4 q4 J1 B% a9 D% y first_id_str = '', R2 ^/ L5 [. _4 b# ~/ O- ~
else:
1 m: \' D- D( P) ^! d6 G- O first_id_str = re.findall(r'[a-zA-Z]+', first_id)[0]% G; w# H) X+ K' n1 r1 u* c7 B8 P
. w0 V/ H5 T9 M. X5 L% ]
# 添加代替品
i# W: ?- [( h6 S" { pa = ''- Z" V' ]- }0 Y8 V1 ~
if len(data) >= 4:
! F8 E2 l" V% f# u pa = data[3]
8 {1 o8 E3 f8 M6 H" ]1 }6 \; T: `. G6 j" v! {" d3 T& F
for i in list1:
Y. g! G- R' Y% {+ q A if '-' in i:
/ c0 S( Z7 _# G$ Q- Z print("带-或空格的回路开始分解")6 _& w2 Q- }3 n: ^
item = i.split('-')" k& u/ z6 s5 f' B, U+ c
item_start = item[0]
" [; I5 |3 }) Y. W item_end = item[-1]4 E& I9 N. \( K, a# L! o4 K
item_str = re.findall(r'[a-zA-Z]+', item_start)
; U' k0 b4 G+ { if item_str:9 N4 c9 P O% v- {0 S: ^+ R
item_str = item_str[0]# S5 |! B0 H. o7 o% S5 X* T- I
else:
$ ?) n1 R* T! R+ N+ |. u item_str = first_id_str
9 `4 X* T, m9 q. G5 Z( g! N data_num = re.findall(r"\d+", item_start)& o$ E% M% m# G5 U
item_start_num = int(data_num[0])
& G& P* O" y x6 o, l item_end_num = int(re.findall(r"\d+", item_end)[0])
8 x- C$ I/ j0 |8 N: e l# X" p2 |5 I$ D2 A- z3 j6 l; N
for a in range(item_start_num, item_end_num + 1):- B! Z4 D/ f M5 f5 u l; \2 k
c = item_str + str(a)9 a* u, C# k7 F/ N5 {
# m* D8 M' T; G/ r6 k8 c- S
new_list.append([data[0], data[1], c, pa])
& n: N2 Q3 e! }% O B # print(item_str,item_start_num,item_end_num)
9 u1 z6 T6 |' S+ E1 p0 q' m else:% e. `0 Z W6 _- K
if i.isdigit():
8 `* C5 F6 a, S7 j# D c = first_id_str + i/ y2 N/ T0 O& |& o9 N* j
new_list.append([data[0], data[1], c, pa]) y( f' L; Q$ [; _* P3 l7 F* g
else:! `. z1 C, R& L9 M6 R
new_list.append([data[0], data[1], i, pa])
( o) i- E1 Y) x. ]( h print(new_list)# c# Y$ g- ~4 y6 E1 X
return new_list( c& b$ C( m9 [4 C5 C& y
. L8 h& ]/ R" K; V1 c$ k- j& U
5 Q5 ~) y6 H7 `6 @ v- Vdef parse_data():0 s7 I$ ?/ c1 |/ M
for name in file_names:
' m9 T4 A( _; W4 B- d& c1 q+ F print(name)
. h9 @! T/ h7 ~( _8 c, J$ f if '.xls' in name:; y2 a, d/ I. }3 t
wb = load_workbook(data_dir + name)
' D. F# l: G) |* J2 u' z8 K # print(data_dir+name)
% @9 H( U" N8 N8 j0 g0 S9 X sheet = wb.active# ?7 p4 `, f. q6 P u4 ^2 n3 Q
sheet_data = []
" P0 H. y8 |) N% A for rows in sheet:
) r* e2 u' Y0 F, Q4 e" _ row_list = []
. ]6 i9 v9 D S& c for cell in rows:
( s" H) l3 C5 V, Q; m. n( I" i- k row_list.append(cell.value)
" M6 U7 _+ D, f: X1 y sheet_data.append(row_list)
# l8 f* f, D( j8 O( C0 [& T # print(sheet_data)
9 ?3 P7 V7 D/ R: c0 W- O& v( C# c" s( B
new_sheet_data = []5 t3 S# M, } W9 D }
for items in sheet_data:
3 Z" ~( l4 d0 x% d if items[2] == None:4 U2 y. y; N; }- ~ Y3 c
continue, `' |* A1 A9 g
data = items[2]" _ Y. \) O G. [* O' x
if ',' in data or '-' in data or " " in data:# l, d+ e% {0 J' g$ C6 [0 ]# ~
new_list = parse(items): a% {4 v1 m: t" G: G# s
for parse_list in new_list:
0 X" L4 Y$ G* M. Q. S! L2 h/ } new_sheet_data.append(parse_list)
0 _. V- ~6 d' K5 ?6 \& c: m # print(new_list). r% E; m7 o. W, y; V# Z0 h2 o2 M
9 l! P# d' ~$ }* @ k. | else:$ b* P5 x/ M L: v$ E9 Q! W0 [# n9 [7 E
new_sheet_data.append(items)0 w$ W$ O+ ]1 }
# print(new_sheet_data)' c4 s' {/ N4 W- X8 T+ c
sheet2 = wb.create_sheet("new_sheet")
9 t) ^0 c# J! c3 X) F9 N1 s print("创建新的sheet完成,sheet名:new_sheet")( [0 C4 `" R$ A) ?: m
for d in new_sheet_data:# y3 J U+ {/ I* f- m( R& j/ f
if isinstance(d, list):; T4 v% O0 H2 @; O$ S
sheet2.append(d)
0 B- ~# y; } U else:2 a( q8 q- H* K0 z4 }* k% ]# k
print(d, "格式不对-->", type(d))
6 @) U2 A2 U5 K+ j/ R: z wb.save(data_dir + name)
- x. c0 [+ ]7 d( K# h wb.close(). `+ _) @! [* \/ h( [, _9 r
print("分解完成")* O3 G' ?5 v$ N/ f6 k( E; s7 f1 @
; E$ Q/ t8 z4 @- U* |7 ^' u
, H5 b7 Q% x, C5 `; Q! P
if __name__ == '__main__':) H& m6 d6 T. l7 s
parse_data()8 H$ t# Q, [9 ?/ |
( @. r7 `) {9 o1 Y
/ v0 E% w) n5 w6 \, Z( m0 }* t [2 Z
8 t Y$ T" P+ m- o }& |! i- D侵权联系与免责声明1、本站资源所有言论和图片纯属用户个人意见,与本论坛立场无关
% b7 Y7 G' i! P& {) [# m$ V: |2、本站所有资源收集于互联网,由用户分享,该帖子作者与瑞客论坛不享有任何版权,如有侵权请联系本站删除
, o9 l5 {8 A* e# ]; \! @ j3、本站部分内容转载自其它网站,但并不代表本站赞同其观点和对其真实性负责! l" B1 v1 I0 }) @/ B
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意: I/ M' u- z I! i' e" I3 e5 V5 `
如有侵权联系邮箱:ruikelink@gmai.com
: n9 H% m. e7 T0 e3 l6 U4 r资源下载地址和密码(百度云盘): [/hide] 百度网盘信息回帖可见
- U5 T7 h q6 T* Z
8 ?. B4 R7 S1 ~+ T% _4 t- ~. R
: U2 ]; ^) x( V* z本资源由Java自学网收集整理【www.javazx.com】 |
|