【技术导向】Openpyxl在自动化办公中的应用

项目场景:

Note: 包括但不限于工程机械等相关行业的测试过程

项目场景:在大量测试数据的积累下,员工需要自主识别并手动修改测试过程中存在的异常数据以及判断其中不符合规定参数的样品。因此,我们需要设计一个可由用户输入额定参数以及误差,在导入测试数据(type: .txt)后,程序自动判断并执行修改表格底色的操作,并输出为Excel表格,其中内置判断逻辑由产品组提供。


问题描述

Note: 生成的Excel表格不具备自适应改色能力,首列的实验序号不具备自动识别错误的能力

在version=1.1.0版本中,针对Excel表格的操作由python判断每个cell的值来逐一决定其颜色的填充。这种方式不具备自适应更改底色的能力,无法满足用户对于软件的最新需求(在Excel表格中修改值的同时,其底色也要随着其变色逻辑而改变)。

# 定义颜色格式
green_fill = PatternFill(start_color='AACF33', end_color='AACF33', fill_type='solid')
red_fill = PatternFill(start_color='EE1111', end_color='EE1111', fill_type='solid')

if abs(ws.cell(row=i + 2, column=j).value - float(var['st_' + str(j - 1) + 'l'].get())) 
<= float(var['to_' + str(j - 1)].get()) + 0.01:
	# 判断过程在程序中进行
	ws.cell(row=i + 2, column=j).fill = green_fill/red_fill

原因分析:

原始需求解读:

  1. 输入:额定值,偏差值,文本文档,选择马达类型
  2. 输出:Excel表格(对应单元格改色,隐藏未选中马达类型的列)

新增需求分析:

  1. 输入保持不变
  2. 输出:Excel表格(具备格式属性,可自适应更改底色,同时对首列元素值自动判断是否顺序排列)

无法匹配当前需求的原因:原始版本的填色操作由python程序执行判断,属于一次性的固定操作,无法达到自适应更改底色的效果。所用函数及方法的代码实现如下:

wb = openpyxl.Workbook()
ws = wb.active
ws.cell(row, column).fill = PatternFill

解决方案:

Plan A:利用openpyxl中的条件控制方法(FormularRule)False

ws.conditional_formatting.add(f'{chr(idx+64)}{idx}', FormulaRule(formula=[ws[idx][0].value 
< ws[idx-1][0].value], stopIfTrue=True, fill=red_fill))
"""
parameter_1: 被操作数
FormulaRule: formula = 公式内容,满足则填色。
"""
# f'{}'可用于操作Excel表格的变量,在该代码中表示大写字母从A开始的ASCII码值
# chr(number): 将数字转换为ASCII码值的函数

该做法无法达到最新的项目需求,原因在于其本质还是在通过元素值的比较进行判断是否填色,与最初的做法无异。

Plan B:利用openpyxl中的条件控制方法(CellIsRule)True

ws.conditional_formatting.add(f'A{idx+1}',CellIsRule(operator='lessThanOrEqual', 
formula=[f'A{idx}'], stopIfTrue=True, fill=red_fill))
# 判断f'idx+1'是否小于等于f'idx',满足则填色
"""
parameter_1: 被操作数1
CellIsRule:operator = 比较方式, formula = 操作方法
"""
ws.conditional_formatting.add(f'{chr(jack + 64)}{idx + 2}', CellIsRule(operator='between', 
formula=[float(pro) - float(plus), float(pro) + float(plus)],stopIfTrue=True, fill=green_fill))
# 判断f''是否在区间(pro-plus, pro+plus)内

该方法可以完美解决新增的两项需求,采用条件控制方法和f’{}'函数对Excel表格进行自动格式条件控制,其判断标准相当于写在了表格内部,而非python程序执行过程中进行的绝对匹配。


版权声明:本文为weixin_41441616原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。