瑞客论坛

 找回密码
 立即注册
查看: 502|回复: 10

python实现的生产BOM实现标准输出

[复制链接]

金币2366  第782名

1

主题

1322

回帖

6442

积分

论坛元老

Rank: 8Rank: 8

威望
2601
贡献
1475
热心值
0
金币
2366
注册时间
2023-9-14
发表于 2024-7-27 14:57 | 显示全部楼层 |阅读模式
解决问题点
拿到一个产品的BOM,有许多位号对应的原材料品番。

买材料的时候需要一个材料对应几个位号,但是生产核对的时候核对的是位号对应的品番,下面实现的好几种位号的BOM,拆分成一个位号对应一个品番,方便核对。

处理之前
品番使用数量位号
品番1
11
C357,370,374-376,383-385,387-389
品番2
11
C14,15,131,221-223,235-237,241,242
品番3
9
C12,13,88,90,92,96,100,103,104
品番4
8
C111,112,115,117,119,121,122,130
品番5
11
C132,218-220,230-234,245,246
品番6
48
C257-280,290-304,307-310,317-321


处理之后
品番使用数量位号
品番1
11
C357
品番1
11
C370
品番1
11
C374
品番1
11
C375
品番1
11
C376
品番1
11
C383
品番1
11
C384
品番1
11
C385
品番1
11
C387
品番1
11
C388
品番1
11
C389
品番2
11
C14
品番2
11
C15
品番2
11
C131
品番2
11
C221
品番2
11
C222
品番2
11
C223
品番2
11
C235
品番2
11
C236
品番2
11
C237
品番2
11
C241
品番2
11
C242
品番3
9
C12
品番3
9
C13
品番3
9
C88
品番3
9
C90
品番3
9
C92
品番3
9
C96
品番3
9
C100
品番3
9
C103
品番3
9
C104
品番4
8
C111
品番4
8
C112
品番4
8
C115
品番4
8
C117
品番4
8
C119
品番4
8
C121
品番4
8
C122
品番4
8
C130
品番5
11
C132
品番5
11
C218
品番5
11
C219
品番5
11
C220
品番5
11
C230
品番5
11
C231
品番5
11
C232
品番5
11
C233
品番5
11
C234
品番5
11
C245
品番5
11
C246
品番6
48
C257
品番6
48
C258
品番6
48
C259
品番6
48
C260
品番6
48
C261
品番6
48
C262
品番6
48
C263
品番6
48
C264
品番6
48
C265
品番6
48
C266
品番6
48
C267
品番6
48
C268
品番6
48
C269
品番6
48
C270
品番6
48
C271
品番6
48
C272
品番6
48
C273
品番6
48
C274
品番6
48
C275
品番6
48
C276
品番6
48
C277
品番6
48
C278
品番6
48
C279
品番6
48
C280
品番6
48
C290
品番6
48
C291
品番6
48
C292
品番6
48
C293
品番6
48
C294
品番6
48
C295
品番6
48
C296
品番6
48
C297
品番6
48
C298
品番6
48
C299
品番6
48
C300
品番6
48
C301
品番6
48
C302
品番6
48
C303
品番6
48
C304
品番6
48
C307
品番6
48
C308
品番6
48
C309
品番6
48
C310
品番6
48
C317
品番6
48
C318
品番6
48
C319
品番6
48
C320
品番6
48
C321

如果大家觉得使用,可以点赞收藏,不好用也希望提下改善建议。
测试运行环境:
python版本 :python 3.7
IDE:Pycharm2022.1.1
模块使用:os,re,openpyxl,tkinter

源码:初次发表,源码如下:
# -*- coding:utf-8 -*-
"""
# @File : excel数据拆分.py
# @Author:chen
# @Date : 2024/1/5
# @Desc :
"""
import re
import os
from tkinter import filedialog
from openpyxl import load_workbook

# 定义文件夹路径
# folder_path = os.path.dirname(os.path.abspath(__file__))
data_dir = filedialog.askdirectory(title='请选择文件夹') + '/'

# 列出文件夹中的所有文件和文件夹
files = os.listdir(data_dir)

# 遍历文件列表,筛选出文件名
file_names = [file for file in files if os.path.isfile(os.path.join(data_dir, file))]
print("需要处理的文件名:", file_names)


def parse(data):
    list1 = []
    if ',' in data[2]:
        list2 = data[2].split(',')
        # print(list2)
        # print("*"*90)
        list1 = [i for i in list2 if i is not '']
        # print(list1)
    elif ' ' in data[2]:
        list2 = data[2].split(' ')
        # print(list2)
        # print("*"*90)
        list1 = [i for i in list2 if i is not '']
    else:
        list1 = [data[2]]
        # print(list1)

    # 针对第一个字母的多个回路改进  C300-335,350-405,407,268-275,520
    # 问题点 回路没有字母的需要判断一下
    new_list = []
    first_id = list1[0]
    if first_id.isdigit():  # 判断回路是不是纯数字组成
        first_id_str = ''
    else:
        first_id_str = re.findall(r'[a-zA-Z]+', first_id)[0]

    # 添加代替品
    pa = ''
    if len(data) >= 4:
        pa = data[3]

    for i in list1:
        if '-' in i:
            print("-或空格的回路开始分解")
            item = i.split('-')
            item_start = item[0]
            item_end = item[-1]
            item_str = re.findall(r'[a-zA-Z]+', item_start)
            if item_str:
                item_str = item_str[0]
            else:
                item_str = first_id_str
            data_num = re.findall(r"\d+", item_start)
            item_start_num = int(data_num[0])
            item_end_num = int(re.findall(r"\d+", item_end)[0])

            for a in range(item_start_num, item_end_num + 1):
                c = item_str + str(a)

                new_list.append([data[0], data[1], c, pa])
            # print(item_str,item_start_num,item_end_num)
        else:
            if i.isdigit():
                c = first_id_str + i
                new_list.append([data[0], data[1], c, pa])
            else:
                new_list.append([data[0], data[1], i, pa])
    print(new_list)
    return new_list


def parse_data():
    for name in file_names:
        print(name)
        if '.xls' in name:
            wb = load_workbook(data_dir + name)
            # print(data_dir+name)
            sheet = wb.active
            sheet_data = []
            for rows in sheet:
                row_list = []
                for cell in rows:
                    row_list.append(cell.value)
                sheet_data.append(row_list)
            # print(sheet_data)

            new_sheet_data = []
            for items in sheet_data:
                if items[2] == None:
                    continue
                data = items[2]
                if ',' in data or '-' in data or " " in data:
                    new_list = parse(items)
                    for parse_list in new_list:
                        new_sheet_data.append(parse_list)
                    # print(new_list)

                else:
                    new_sheet_data.append(items)
            # print(new_sheet_data)
            sheet2 = wb.create_sheet("new_sheet")
            print("创建新的sheet完成,sheet名:new_sheet")
            for d in new_sheet_data:
                if isinstance(d, list):
                    sheet2.append(d)
                else:
                    print(d, "格式不对-->", type(d))
            wb.save(data_dir + name)
            wb.close()
            print("分解完成")


if __name__ == '__main__':
    parse_data()




回复

使用道具 举报

金币2366  第782名

1

主题

1322

回帖

6442

积分

论坛元老

Rank: 8Rank: 8

威望
2601
贡献
1475
热心值
0
金币
2366
注册时间
2023-9-14
 楼主| 发表于 2024-7-27 18:39 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

金币2570  第718名

0

主题

1871

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

威望
5098
贡献
3325
热心值
0
金币
2570
注册时间
2022-11-7
发表于 2024-7-27 19:43 | 显示全部楼层
看到这帖子真是高兴!
回复

使用道具 举报

金币1229  第1507名

19

主题

1276

回帖

4546

积分

论坛元老

Rank: 8Rank: 8

威望
2260
贡献
1056
热心值
1
金币
1229
注册时间
2024-3-1
发表于 2024-7-27 22:10 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

金币2089  第882名

2

主题

2052

回帖

8609

积分

论坛元老

Rank: 8Rank: 8

威望
4160
贡献
2360
热心值
0
金币
2089
注册时间
2023-5-16
发表于 2024-7-27 22:14 | 显示全部楼层
楼主加油,我们都看好你哦。
回复

使用道具 举报

金币188  第5926名

0

主题

1214

回帖

5630

积分

论坛元老

Rank: 8Rank: 8

威望
3325
贡献
2117
热心值
0
金币
188
注册时间
2022-6-29
发表于 2024-7-27 22:35 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

金币146  第6957名

5

主题

2928

回帖

8471

积分

论坛元老

Rank: 8Rank: 8

威望
5042
贡献
3283
热心值
0
金币
146
注册时间
2023-3-8
发表于 2024-7-28 00:34 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

金币1809  第1027名

2

主题

630

回帖

4530

积分

论坛元老

Rank: 8Rank: 8

威望
1547
贡献
1174
热心值
0
金币
1809
注册时间
2023-12-2
发表于 2024-7-28 00:45 | 显示全部楼层
真是难得给力的帖子啊。
回复

使用道具 举报

金币665  第2652名

1

主题

1863

回帖

9354

积分

论坛元老

Rank: 8Rank: 8

威望
5188
贡献
3501
热心值
0
金币
665
注册时间
2022-3-23
发表于 2024-7-28 08:25 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

金币11  第17020名

0

主题

23

回帖

31

积分

新手上路

Rank: 1

威望
13
贡献
7
热心值
0
金币
11
注册时间
2024-7-18
发表于 2024-8-5 16:49 | 显示全部楼层
虽然用不着,但学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|瑞客论坛 |网站地图

GMT+8, 2025-3-14 06:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表