PS:因误删了以前攒下来的想法、思路和内容,导致断更许久,目前只找回想法和思路,内容要重新写,可能更文的速度还是会慢。
前阵子有位粉丝拿着我以前写的填表程序来问我,说我这代码不太行,我心想怎么可能不行呢,然后我一波操作下来,发现确实不行,准确的说,是不适用他的需求。具体哪里不适用,我们后面会讲!
合同信息数据
而前面说的不适用可以从下图中的产品信息得知,他有些是需要插入多条数据的,而以前的程序只适用插入一条数据。
合同模板
粉丝需求:
1、从合同信息数据中取出
35-161
行数据,具有相同的合同编号的放在同一工作簿,然后一一填入合同模板相应的位置中。2、生成以合同编号
、商标
、型号
、工厂
为名的excel工作簿,各个字段之间需要加入空格
。
整个需求的实现逻辑可以分为以下 4 步:
实现这4步并不难,下面我开始一步步实现。
用的库是我们的老熟人了:
import pandas as pd
import openpyxl
还没安装的可以用pip命令安装,基本都能安装完成:
pip intsall 库名
实现取出35-161行数据的需求,用到的是pandas内置函数:iloc
,iloc函数主要通过索引行获取数据,只要区别loc
函数。
举个例子:
mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
{'a': 100, 'b': 200, 'c': 300, 'd': 400},
{'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000 }]
df = pd.DataFrame(mydict)
df
示例
df.iloc[0:2]
示例结果
本文只要通过切片索引取得区间列,iloc函数中还有其它操作,大家可以自行研究。
据于此,我们可以使用lioc函数快速取出合同信息数据中的35-161行数据:
df = pd.read_excel(r"D:\数据.xlsx", header=1).iloc[35:161]
取出数据时需要把header选用工作表中第二行作为标题行,因为在工作表中第一行的标题并不符合我们的操作需求:
说明
想取出相同的合同编号,只用unique函数是不行的,unique函数的作用是取出一列中的唯一值,以前在拆分工作表中也说过,这里就不再演示。
这里直接用循环遍历‘合同编号’列,取出唯一值,再通过==
判断内容是否与唯一值相同,相同的会放到一起:
for o in df['合同编号'].unique():
wb = openpyxl.load_workbook(r"D:\模板.xlsx")
ws = wb['内合同']
x = df[df['合同编号'] == o]
函数使用结果
把数据填入表格中并不难,但需要注意的是同个合同编号,里面会有多条数据,所以单元格的行坐标是需要变动的:
for p, t, b, c in zip(range(len(x)), x['商标'], x['型号'], x['工厂']):
lists = ['k2', f'E{7 + p}', f'F{7 + p}', f'G{7 + p}', f'H{7 + p}', f'I{7 + p}', f'L{7 + p}']
title = ['合同编号', '型号', '颜色', '规格', '数量','鞋子单价', '货号']
ws.title = str(o)
for i in range(len(lists)):
# 填入表格
ws[lists[i]].value = [i for i in x[title[i]]][p]
# 命名
wb.save("{} {} {} {}.xlsx".format(o, t, b, c))
运行代码即可得到各个合同编号相应的合同:
结果excel文件
相应的内容也完美的插入到相应的单元格中:
成品合同
至此,我们就成功利用Python解决了粉丝的填表需求,实现了解放双手。
本文分享自 Python与Excel之交 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!