背景
有很多朋友对Python处理excel很感兴趣,虽然我不是这方面的专家,如果用C# openxl 是分分钟搞定的事情,再次点用Npoi也行,Python则完全陌生。
目标
既然以学习为目标去完成这件事,那么就不必太复杂(复杂我也做不来),就假设我们是在做销售系统吧。如果不专业请轻喷。
一份Excel的产品单,一份客户单,一份订单,字段简单点。
从头开始生成
一,工具
既然使用Python,当然要介绍一下工具库:
主要有openpyxl、xlwt、xlrd、Pandas(这是真的可以)、xlsxwriter
先来分析对比一波
1、Openpyxl
优势:快速、高效地读写Excel,可控制大部分Excel元素,并且写入时可以贴入公式
劣势:对初学者非常不友好,属性超级多,并且按xml格式控制;再来样式只能定义一次,修改样式就得先复制一份再重新构造,工作量几何级上升
2、xlsxwriter
专门用于写数据的方法
优势:快速,可控制大部分样式,公式只能以字符串处理,写数据以xy定位或单元格命名为主
劣势:没有毒没有毒没有毒,所以,千万别用同一份excel文档进行处理(我就吃了这个亏,好好几十万条记录被清洗一空),暂时不知道怎么追加到原文档后添加新sheet
3、xlrd、xlwt
可读写的excel库
优势:基本上用来读excel数据,非常精准、数据类型清晰
劣势:写明显很慢,10万条记录写了我10分钟(个人电脑,超级电脑可能会快点),而且不能操作样式?反正我没有找到对应的方法
综上初步研究,暂定xlrd 读文件,xlwt写新文档,准备好就开始
二、开始前准备
安装对应的库,怎样安装我就不在这里介绍了,可以私聊。
环境:python3.8,excel xlsx
pip install xlwt \ pip install xlrd \ pip install xlsxwriter
三、数据准备
接下来,我们需要模拟客户信息,为了方便管理处理,我们random,只制作简单的字段就行:ClientID、ClientName、Discount、Members、Industry
产品信息:ProID、ProName、Catalog、PurchasePrice、UnitPrice
这里不考虑进货存货问题,假设有勤劳的快递员不断补货
生成文件ClientCreator.py
# 随机生成客户信息
import random
import string
import CreateName
import xlsxwriter
# key 初始位置
ckbase = 10000
def CreateClients():
clients =[]
for i in range(100000):
clients.append( CreateClient())
return clients
# 生成单个客户
def CreateClient():
# ClientID、ClientName、Discount、Members、Industry
global ckbase
ckbase += 1
cid = 'ck' + str(ckbase)
cname = CreateName.create_name2()
dis = discountRandom(1, 10)
mem = random.randint(1, 5)
indu = IndustryCreate()
client = [cid,cname,dis,mem, indu]
return client
def p(text):
print(text)
# discount 随机函数
def discountRandom(_min, _max):
r1 = random.randint(0, 10)
result = 0
if(r1 > 6):
result = random.randint(_min, _max)
return result
def IndustryCreate():
xlist = [
'计算机','金融','教育','旅游','社交','电商']
n = random.randint(0, len(xlist) - 1)
rs = xlist[n]
return rs
def write2excel(path,clients):
# todo 创建excel文件
xl = xlsxwriter.Workbook(path)
# todo 添加sheet
sheet = xl.add_worksheet('Client')
#标题行 ClientID、ClientName、Discount、Members、Industry
sheet.write_string(0,0,'ClientID')
sheet.write_string(0,1,'ClientName')
sheet.write_string(0,2,'Discount')
sheet.write_string(0,3,'Members')
sheet.write_string(0,4,'Industry')
rowIndex = 0
colIndex =0
for row in clients:
colIndex = 0
for col in row :
sheet.write_string(rowIndex+1,colIndex,str(col))
colIndex += 1
rowIndex += 1
# todo 关闭文件
xl.close()
return "-- Done --"
if __name__ == '__main__':
cs = CreateClients()
p(cs)
write2excel(r'client1.xlsx',cs)
需要解释几点
- CreateName 是独立的一个py文件,有需要小伙伴可以留邮箱
- id是按顺序生成,discount、member 随机生成,行业暂定几个
- xlsxwriter.Workbook(path) 是你保存的路径,自行修改
接下来是产品,使用类似的脚本生成,我就不贴代码了
四、生成交易数据
前2份excel分别对应产品和客户,接下来我们模拟交易。
- 任何客户可以任何东西(下一阶段我们再去限制购买种类)
- 购买数量没有库存限制(下一阶段)
- UnitPrice 是售卖单价,我们随机添加 商品discount,与客户discount叠加,也就是说 1 - 0.08 - 0.06 ,在扣减Purchase,得到利润 Profit(可以折上折,下一阶段)
开整 -------
转移到Part2
来源:oschina
链接:https://my.oschina.net/u/4345075/blog/4312963