一、背景
在一个excel表中,希望实现excel表格中的数据进度条根据不同值的大小,分别绘制不同颜色的数据进度条,以方便快速确定进度的进展情况,如当B字段比A字段值小时,绘制红色数据进度条,反之绘制绿色数据进度条。 图例:
希望呈现的结果:
二、分析
手动方式在excel中操作,我们发现,如果想批量设置数据进度条格式,需要的要求是数据是连续相同条件下才可以设置相同的格式,非连续数据并不能快速的完成设置,所以我们需要先将相同条件的数据放置到一起,然后才能快速快速设置格式。
三、实现方法
这里我们通过python openpyxl 模块来实现, 1、通过读取表格需要比较的两个字段,将不同条件的数据分别提取出来; 2、将提取后的数据,再按同条件连续的方式重新写入文件中; 3、根据数据条件,分别设置数据进度条; 4、文件保存。 注:由于数据进度条的格式设置是固定的,我们在完成文件后,不能对数据进行排序的操作,如果进行重排,会出行数据格式不一致情况。 实际数据展示效果:
四、代码实现
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.formatting.rule import DataBarRule
"""
1、excel中,无法对一个连续区域设置不同的数据进度条;
2、需要设置不同数据进度条,先将数据进行拆分,然后再合并后进行设置,保证相同格式数据是连续的;
3、完成设置后的数据,因为数据进度条范围是固定的,不能对数据进行排序。
"""
def temp_data(ws, workbook, ls, filename):
"""
按条件删除行
"""
for j in ls[::-1]:
ws.delete_rows(idx=j, amount=1)
workbook.save(filename)
def data_formatting(ws, color, start, end):
"""
添加数据进度条
"""
rule = DataBarRule(
start_type="num", end_type="num", start_value="0", end_value="1", color=color
)
ws.conditional_formatting.add(f"C{start}:C{end}", rule)
workbook1 = load_workbook(filename="demo.xlsx")
ws1 = workbook1.active
workbook2 = load_workbook(filename="demo.xlsx")
ws2 = workbook2.active
ls1 = []
ls2 = []
for i in range(2, len(ws1["A"]) + 1):
if ws1[f"C{i}"].value >= ws1[f"B{i}"].value:
ls1.append(i)
else:
ls2.append(i)
temp_data(ws1, workbook1, ls1, "green.xlsx")
temp_data(ws2, workbook2, ls2, "red.xlsx")
workbook1 = load_workbook(filename="green.xlsx")
ws1 = workbook1.active
workbook2 = load_workbook(filename="red.xlsx")
ws2 = workbook2.active
m = len(ws1["A"]) + 1
for row in ws2.rows:
ls = []
for i in row:
ls.append(i.value)
ws1.append(ls)
ws1.delete_rows(idx=m, amount=1)
green_start = 2
green_end = m - 1
red_start = m
red_end = len(ws2["A"]) + 1 + red_start
data_formatting(ws1, "FF0000", green_start, green_end)
data_formatting(ws1, "00FF00", red_start, red_end)
for cells in ws1["B:C"]:
for cell in cells:
cell.number_format = "0.00%"
workbook1.save("new1.xlsx")