【办公自动化实例】通过openpyxl模块,快速进行数据进度条不同条件的设置

文章目录

  • 一、背景
  • 二、分析
  • 三、实现方法
  • 四、代码实现

一、背景

在一个excel表中,希望实现excel表格中的数据进度条根据不同值的大小,分别绘制不同颜色的数据进度条,以方便快速确定进度的进展情况,如当B字段比A字段值小时,绘制红色数据进度条,反之绘制绿色数据进度条。 图例:

【办公自动化实例】通过openpyxl模块,快速进行数据进度条不同条件的设置_第1张图片
希望呈现的结果:
【办公自动化实例】通过openpyxl模块,快速进行数据进度条不同条件的设置_第2张图片

二、分析

手动方式在excel中操作,我们发现,如果想批量设置数据进度条格式,需要的要求是数据是连续相同条件下才可以设置相同的格式,非连续数据并不能快速的完成设置,所以我们需要先将相同条件的数据放置到一起,然后才能快速快速设置格式。

三、实现方法

这里我们通过python openpyxl 模块来实现, 1、通过读取表格需要比较的两个字段,将不同条件的数据分别提取出来; 2、将提取后的数据,再按同条件连续的方式重新写入文件中; 3、根据数据条件,分别设置数据进度条; 4、文件保存。 注:由于数据进度条的格式设置是固定的,我们在完成文件后,不能对数据进行排序的操作,如果进行重排,会出行数据格式不一致情况。 实际数据展示效果:

【办公自动化实例】通过openpyxl模块,快速进行数据进度条不同条件的设置_第3张图片

四、代码实现

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")

你可能感兴趣的:(办公自动化,python)