同一个excel文件,分配到各组填写, 最后统一汇总成一个文档反馈。
环境
-
- windows10
- python3.7 + openpyxl
目标
-
- in目录存放各个组填写的文档
- out目录存放合并后的结果文件
实现
- 表格
| 序号 | 产品 | 信息 | 反馈1 | 反馈2 |
|---|---|---|---|---|
| 01 | 产品1 | X | 00000 | 999999 |
| 02 | 产品2 | X | 11111 | 888888 |
| 03 | 产品3 | X | 22222 | 777777 |
- 代码:
from openpyxl import load_workbook
from openpyxl import Workbook
import os
## 获取所有的文件
def getfilelist(dirname):
li = []
for f in os.listdir(dirname):
if f.endswith('.xlsx'):
li.append(f)
return li
## 更新
## 1. 打开输出文件,处理一个sheet页面,
## 2. 循环获取某一行记录,放入字典结构从所有的输入文件中获取补充记录
## 3. 如果是单条直接更新, 如果出现重复记录入职(暂不处理)
## 4. 依据以上处理方式,处理完所有sheet页面
INPATH=".\\in\\"
OUTPATH=".\\out\\"
productlist = ('product1','product2')
## 1. sheetname名称
## 2. 位置1: 过滤条件 product 所在列位置,判断是否productlist
## 3. 位置2:通过判断第一个需要填写项判断是否填写数据
sheetlist = ( ('sheet1)', 6, 15),
('sheet2', 6, 13),
('sheet3', 5, 12),
('sheet4', 6, 14))
def update():
inlist = getfilelist(".\\in")
outlist = getfilelist(".\\out")
for li in sheetlist:
sheetname = li[0]
product = li[1]
firstfilled= li[2]
d = readdata(inlist, sheetname, product, firstfilled)
writedata(outlist, d, sheetname)
def readdata(inlist, sheetname, product, firstfilled):
d = {}
for i in inlist:
wb = load_workbook(filename = INPATH+i)
ws = wb[sheetname]
row = tuple(ws.rows)
c = filter(lambda cell: (cell[product].value in productlist) and (cell[firstfilled].value is not None), row)
for cell in c:
d[cell[0].row] = cell
return d
def writedata(outlist, d, sheetname):
wbout = load_workbook(filename = OUTPATH+outlist[0])
wsout = wbout[sheetname]
print(sheetname)
#for key in d.keys():
for key in d:
for col in range(1, wsout.max_column+1):
wsout.cell(row=key, column=col).value = d[key][col-1].value
wbout.save(filename = OUTPATH+outlist[0])
update()
代码调整:
for key in d.keys(): --> for key in d:
字典keys()方法遍历前会生成临时列表, 导致消耗大量内存, 应使用默认iterator方式。
参考
极客时间-python核心技术与实战
Photo by Jη ✿@Jeanne_8L from twitter


Comments are closed.