职场人的时间该用在刀刃上!告别低效手工操作,从 Python 自动化思路入手
原始数据:
先分析数据:
1、这两组数据在一个工作簿里,但不在同一个工作表里,左边的是张三统计的、右边的是李四统计的;
2、被绿框圈起来的区域,不难发现,两组数据是无序的;
3、被红框圈起来的区域,代表数据长度是一样的(其实不一样也不影响);
4、被蓝框圈起来的区域,代表两组数据对应相同产品销量统计可能存在异常。
输出成果:
分别对异常数据进行了标黄处理
为了使异常数据更具对比性,新建了工作表,并对存在异常的产品进行汇总
编程思路:
代码解析:
1、导入openpyxl库、创建临时变量、定义填充颜色样式
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
问题行 = set() # 创建集合,集合具有只有读取、写入、不能修改,且不存在重复值的特性
临时列表 = []
# 定义黄色样式
黄色样式 = PatternFill(
start_color='FFFFFF00', # 黄色(RGB: 255, 255, 0)
end_color='FFFFFF00', # 黄色(与start_color相同)
fill_type='solid' # 纯色填充
)
2、读取工作簿里的张三、李四工作表
工作簿 = load_workbook("4号店.xlsx")
工作表1 = 工作簿["张三"]
工作表2 = 工作簿["李四"]
3、对两组数据以行为单位进行挨个判断,同时对异常数据进行填充颜色、并将异常数据单元格行数保存在集合里
for 工作表1的行 in 工作表1.iter_rows(2,31,1,4):
for 工作表2的行 in 工作表2.iter_rows(2,31,1,4):
if 工作表1的行[0].value == 工作表2的行[0].value:
for 计数 in range(1, 4):
if 工作表1的行[计数].value != 工作表2的行[计数].value:
工作表1的行[计数].fill = 黄色样式
工作表2的行[计数].fill = 黄色样式
问题行.add((工作表1的行[计数].row, 工作表2的行[计数].row))
# 这两个是循环嵌套进行判断的基本操作,两个工作表均从第2行开始读取至第31行结束
for 工作表1的行 in 工作表1.iter_rows(2,31,1,4):
for 工作表2的行 in 工作表2.iter_rows(2,31,1,4):
if 工作表1的行[0].value == 工作表2的行[0].value:
相当于第一轮大循环中是工作表1的第2行,与工作表2的第2行进行比较,如果条件不成立,则工作表1的第2行,与工作表2的第3行进行比较,以此类推
如果条件成立,进行数据处理,则就第二轮大循环,工作表1的第3行,与工作表2的第2行进行比较,如果条件不成立,则工作表1的第3行,与工作表2的第3行进行比较,以此类推
工作表1的行[计数].row:获取该单元格对应表格行数的函数,因为上面保存的是单元格的位置(利于节省内存空间),是以下类型:
<Cell '张三'.A2>
4、新建工作表,并往新工作表里写入汇总好的异常数据并保存为新文件,便于查看
新建工作表 = 工作簿.create_sheet("汇总")
标题一 = ["", "张三", "", "", "", "", "李四", "", "", "", ""]
标题二 = ["产品", "3月销量", "4月销量", "5月销量", "合计", "", "3月销量", "4月销量", "5月销量", "合计"]
新建工作表.append(标题一)
新建工作表.append(标题二)
for 行 in 问题行:
for 列 in ["A", "B", "C", "D", "E"]:
临时列表.append(工作表1[f"{列}{行[0]}"].value)
else:
临时列表.append("")
for 列 in ["B", "C", "D", "E"]:
临时列表.append(工作表2[f"{列}{行[1]}"].value)
新建工作表.append(临时列表)
临时列表.clear()
工作簿.save("4号店_输出.xlsx")
for 列 in ["A", "B", "C", "D", "E"]:因为示例数据内容仅有5列,所有直接输入,如果确实例数较多,可采用range()函数,将临时列表改为 == > 临时列表.append(工作表1.cell(2, 4).value)
其中cell(2, 4),代表是工作表第2行第4列的意思
代码是工具,思路才是核心。期待你用这些方法,解锁属于自己的高效办公方案!欢迎骚扰,咱们下期见!