yskan 发表于 2024-7-27 14:57

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

解决问题点
拿到一个产品的BOM,有许多位号对应的原材料品番。

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

处理之前

品番使用数量位号
品番111C357,370,374-376,383-385,387-389
品番211C14,15,131,221-223,235-237,241,242
品番39C12,13,88,90,92,96,100,103,104
品番48C111,112,115,117,119,121,122,130
品番511C132,218-220,230-234,245,246
品番648C257-280,290-304,307-310,317-321


处理之后

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

如果大家觉得使用,可以点赞收藏,不好用也希望提下改善建议。
测试运行环境:
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 = 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 = for i in list2 if i is not '']
      # print(list1)
    elif ' ' in data[2]:
      list2 = data[2].split(' ')
      # print(list2)
      # print("*"*90)
      list1 = for i in list2 if i is not '']
    else:
      list1 = 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'+', 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'+', 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(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(0], data[1], c, pa])
            else:
                new_list.append(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()




yskan 发表于 2024-7-27 18:39

强烈支持楼主ing……

qqchun 发表于 2024-7-27 19:43

看到这帖子真是高兴!

piggaga00 发表于 2024-7-27 22:10

强烈支持楼主ing……

淘云2023 发表于 2024-7-27 22:14

楼主加油,我们都看好你哦。

wenyu 发表于 2024-7-27 22:35

强烈支持楼主ing……

woodfire 发表于 2024-7-28 00:34

强烈支持楼主ing……

aigc 发表于 2024-7-28 00:45

真是难得给力的帖子啊。

Redamancy 发表于 2024-7-28 08:25

强烈支持楼主ing……

thornjay 发表于 2024-8-5 16:49

虽然用不着,但学习了
页: [1] 2
查看完整版本: python实现的生产BOM实现标准输出