瑞客论坛

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

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

[复制链接]

金币1919  第916名

1

主题

1135

回帖

5686

积分

论坛元老

Rank: 8Rank: 8

威望
2358
贡献
1409
热心值
0
金币
1919
注册时间
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()




回复

使用道具 举报

金币1919  第916名

1

主题

1135

回帖

5686

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币2469  第708名

0

主题

1820

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币903  第1893名

19

主题

1062

回帖

3890

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币1713  第1027名

2

主题

1823

回帖

7943

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币115  第8564名

0

主题

1165

回帖

5463

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币159  第6533名

5

主题

2702

回帖

8147

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币1511  第1171名

2

主题

556

回帖

4046

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币650  第2581名

1

主题

1864

回帖

9328

积分

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

金币11  第19938名

0

主题

23

回帖

31

积分

新手上路

Rank: 1

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 10:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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