从相关表格提取商品目录并排重排序

进销存等开发项目中,商品名称等信息是动态变化的。即时更新商品分类信息表是开发者必备的代码技能。下面介绍一个实现案例,不妥之处请大神指正:

模型设计思路

1、创建一个excel工作簿tab_pss.xlsx和三张工作表(期初库存表openinnginventory、商品采购表tab_purchase、商品信息分类表category);
2、创建七个功能函数(列表排重、读取文件、形成综合列表、获取已有分类信息数量、重排行号、清空分类表数据、将排重的列表按行写入商品分类表)

程序运行原理

将"期初库存"、“采购商品”、“商品分类"三张表的商品名称、规格型号和计量单位三列内容(以下简称"三项内容”)读入一个列表,调用排重函数排重后写入商品分类表。写入前要清空商品分类表除表名和列名以外的全部内容。写入后调用排序函数重新编写商品分类表序号。

模型程序代码

# -*-coding:utf-8 -*-
# Name:category.py
# Author:HaiFeng
# Date:02-06-2023

from openpyxl import load_workbook
import xlrd
import openpyxl
from tkinter import messagebox
"""
Get category of commodity from three sheets of the table.
"""

fname = r'.\\tab_pss.xlsx' 
def LstRD(lst):
	'''#创建列表排重函数'''
	key = lst.index
	nlst =[list(i) for i in set(tuple(_) for _ in lst)]
	nlst.sort(key=key,reverse=False)
	return nlst

def readDataSet(data_path,sheet_index):	
    '''读取当前文件的数据'''
    # 存放不包含表头的数据内容
    content = []  
    wb = load_workbook(data_path)
    sheet1 = wb.worksheets[sheet_index]
    # 迭代读取所有的行
    cnt = 0
    for row in sheet1.rows:
        row_val = [col.value for col in row] #表格中的全部内容
        if cnt == 0 or cnt == 1: #略过表名和列名两行
            pass
        else:
            content.append(row_val)
        cnt = cnt + 1
    print(f'这是读到的文件{sheet_index}数据',content)
    return content

def largelst():
	''' 综合列表'''
	# 获取期初库存、采购登记表、商品信息分类表三个文件数据并组成一个大列表category;注意顺序
	category_s = readDataSet(fname,0)  #获取期初库存登记表数据
	category_c = readDataSet(fname,5)  #获取商品分类登记表数据
	category_p = readDataSet(fname,1)  #获取采购登记表数据
	category = category_s + category_c +category_p #将三张表数据合并。注意顺序
	s = len(category_s);p = len(category_p);c = len(category_c);d = len(category)
	print(f'这是三表提取的商品分类表数据共{d}条')  #,category
	# 从列表category获取用于排重的列表元素。这里取商品名称、规格型号、计量单位三项数据
	lst = []
	for i in category:
		info = i[1:4]
		lst.append(info)
	# 使用排重函数排重
	ls = LstRD(lst)
	e = len(ls)
	print(f'这是排重后的商品分类数据共{e}条')
	return ls

def rcnc(data_path,sheet_index):	# rows of commodity name column
	'''计算获得商品名称列的当前长度,即有多少数据行。Calculate the current length of the commodity name column.That is,how many data rows there are.'''
	data = xlrd.open_workbook(data_path) #打开excel表,返回data对象  注意xlrd从0开始计数行列。
	info = data.sheet_by_index(sheet_index) #索引获取表单-------------------------------------->商品分类表
	pcnamecl = info.col_values(1)[0:] # 这里的1是指第1列(0列为序号),即商品名称。0:指从第1列的0行开始。
	ch = len(pcnamecl)  #第1列20行的话(0->19)可编序号应为18行(2->19) 
	return ch
		
def rerowsn(data_path,sheet_index):		
	'''重排行号'''
	wgsn = rcnc(data_path,sheet_index) #Assign the number of function to the variable wsgn
	wb = openpyxl.load_workbook(data_path)
	ws = wb.worksheets[sheet_index]
	for i in range(3,wgsn+1):  #---->Attention:add 2 to the value of variable named wgsn.(left closing and right opening)
		ws.cell(row=i, column=1).value = i-2 #第1列 去掉表名和列名两行后开始序号
	wb.save(data_path)
	wb.close()
	#messagebox.showinfo(title='提示',message='重排行号完成!')
	
def clean(data_path,sheet_index):
	'''清空表内除表名和列名以外的数据 '''
	wgsn = rcnc(data_path,sheet_index) #The rows number of commodity name column
	print(f"商品分类表原有{wgsn-2}行") #------------------->Why minus 2 here?	
	wb = openpyxl.load_workbook(data_path)
	ws = wb.worksheets[sheet_index]	
	ws.delete_rows(3,wgsn+1) #--->According to the principle of the left closing and right opening to add 1 with the value of wgsn
	wb.save(data_path) #
	wb.close()
	
def bcsj(data_path,sheet_index):
	"""	将排重的列表按行写入商品分类表 """
	clean(data_path,sheet_index)
	wb = openpyxl.load_workbook(data_path)
	ws = wb.worksheets[sheet_index]
	ls = largelst()
	for i in range(0,len(ls)):
		for j in range(0,3):
			ws.cell(row=i+3, column=j+2).value = ls[i][j] #i和j都是从0开始。openpyxl行列都从1开始。因行有表名、列名,列有序号,所以行3列2开始
	wb.save(data_path) 
	wb.close()
	rerowsn(data_path,sheet_index)
	messagebox.showinfo(title='提示',message='数据写入和重新排序完成!')
bcsj(fname,3)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值