前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用14行python代码解决粉丝填表问题~

用14行python代码解决粉丝填表问题~

作者头像
Python与Excel之交
发布2021-10-14 11:11:49
6460
发布2021-10-14 11:11:49
举报
文章被收录于专栏:Python与Excel之交Python与Excel之交

PS:因误删了以前攒下来的想法、思路和内容,导致断更许久,目前只找回想法和思路,内容要重新写,可能更文的速度还是会慢。

前阵子有位粉丝拿着我以前写的填表程序来问我,说我这代码不太行,我心想怎么可能不行呢,然后我一波操作下来,发现确实不行,准确的说,是不适用他的需求。具体哪里不适用,我们后面会讲!

需求讲解

我们先来看一下他发的示例材料:

合同信息数据

而前面说的不适用可以从下图中的产品信息得知,他有些是需要插入多条数据的,而以前的程序只适用插入一条数据。

合同模板

粉丝需求:

1、从合同信息数据中取出35-161行数据,具有相同的合同编号的放在同一工作簿,然后一一填入合同模板相应的位置中。2、生成以合同编号商标型号工厂为名的excel工作簿,各个字段之间需要加入空格

实现逻辑

整个需求的实现逻辑可以分为以下 4 步:

  • 取出35-161行数据
  • 匹配相同的合同编号
  • 把数据填入表格中
  • 生成excel文件

实现这4步并不难,下面我开始一步步实现。

代码实现

用的库是我们的老熟人了:

代码语言:javascript
复制
import pandas as pd
import openpyxl

还没安装的可以用pip命令安装,基本都能安装完成:

代码语言:javascript
复制
pip intsall 库名

取出指定行-iloc函数

实现取出35-161行数据的需求,用到的是pandas内置函数:iloc,iloc函数主要通过索引行获取数据,只要区别loc函数。

举个例子:

代码语言:javascript
复制
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

示例

代码语言:javascript
复制
df.iloc[0:2]

示例结果

本文只要通过切片索引取得区间列,iloc函数中还有其它操作,大家可以自行研究。

据于此,我们可以使用lioc函数快速取出合同信息数据中的35-161行数据:

代码语言:javascript
复制
df = pd.read_excel(r"D:\数据.xlsx", header=1).iloc[35:161]  

取出数据时需要把header选用工作表中第二行作为标题行,因为在工作表中第一行的标题并不符合我们的操作需求:

说明

取出相同的合同编号-unique函数

想取出相同的合同编号,只用unique函数是不行的,unique函数的作用是取出一列中的唯一值,以前在拆分工作表中也说过,这里就不再演示。

这里直接用循环遍历‘合同编号’列,取出唯一值,再通过==判断内容是否与唯一值相同,相同的会放到一起:

代码语言:javascript
复制
for o in df['合同编号'].unique():
    wb = openpyxl.load_workbook(r"D:\模板.xlsx")
    ws = wb['内合同']
    x = df[df['合同编号'] == o]

函数使用结果

填表并保存

把数据填入表格中并不难,但需要注意的是同个合同编号,里面会有多条数据,所以单元格的行坐标是需要变动的:

代码语言:javascript
复制
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解决了粉丝的填表需求,实现了解放双手。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求讲解
  • 我们先来看一下他发的示例材料:
  • 实现逻辑
  • 代码实现
  • 取出指定行-iloc函数
  • 取出相同的合同编号-unique函数
  • 填表并保存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档