繁体   English   中英

如何使用 openpyxl 重构嵌套的 if/elif python panda pivot 表代码?

[英]How can I refactoring nested if/elif python panda pivot table code using openpyxl?

当我开始时,这应该是一个快速的 7 天 pivot 表。 然后它变成了月度报告,我继续在上面构建代码,用颜色编码和总数后的百分比来自动化我们的视图。 我尝试以几种方式进行重构,但我看不到它,我可能完全错误地处理了这个问题,所以我希望有人可以帮助我。 此报告可以在 11-15 的任何行中包含总计(在我将总计重新调整到底部之后)。我 go 使用列 31 天 AG2、30 天 AF2、29 天 AE2 和28 天 AD2。 我做了一堆嵌套的 if 认为这不会变成任何东西。 现在我需要一些帮助来重构,如果只是为了有一个前进的方向,我已经尝试了几种不同的方法,但我似乎总是让它变得更加混乱。 这是仅 31 天的示例。 任何建议将不胜感激,我修改了 dataframe 以将 output 获取到 pivot 表。

    # 31 Days for the Month - Sheet name is Totals
    if Totals['AG2'].value == "Grand Totals":
        if Totals['A15'].value == "Grand Totals":
            Totals['AH2'] = 'Percent'
            Totals['AH3'].number_format = '0.0%'
            Totals['AH3'] = '=AG3/$AG$15'
            Totals['AH4'].number_format = '0.0%'
            Totals['AH4'] = '=AG4/$AG$15'
            Totals['AH5'].number_format = '0.0%'
            Totals['AH5'] = '=AG5/$AG$15'
            Totals['AH6'].number_format = '0.0%'
            Totals['AH6'] = '=AG6/$AG$15'
            Totals['AH7'].number_format = '0.0%'
            Totals['AH7'] = '=AG7/$AG$15'
            Totals['AH8'].number_format = '0.0%'
            Totals['AH8'] = '=AG8/$AG$15'
            Totals['AH9'].number_format = '0.0%'
            Totals['AH9'] = '=AG9/$AG$15'
            Totals['AH10'].number_format = '0.0%'
            Totals['AH10'] = '=AG10/$AG$15'
            Totals['AH11'].number_format = '0.0%'
            Totals['AH11'] = '=AG11/$AG$15'
            Totals['AH12'].number_format = '0.0%'
            Totals['AH12'] = '=AG12/$AG$15'
            Totals['AH13'].number_format = '0.0%'
            Totals['AH13'] = '=AG13/$AG$15'
            Totals['AH14'].number_format = '0.0%'
            Totals['AH14'] = '=AG14/$AG$15'
            # Color coding inside the pivot table
            Totals.conditional_formatting.add('B3:AF14', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                        mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))
            # Color coding for the percent column.
            Totals.conditional_formatting.add('AH3:AH14', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                         mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))

        elif Totals['A14'].value == "Grand Totals":
            Totals['AH2'] = 'Percent'
            Totals['AH3'].number_format = '0.0%'
            Totals['AH3'] = '=AG3/$AG$14'
            Totals['AH4'].number_format = '0.0%'
            Totals['AH4'] = '=AG4/$AG$14'
            Totals['AH5'].number_format = '0.0%'
            Totals['AH5'] = '=AG5/$AG$14'
            Totals['AH6'].number_format = '0.0%'
            Totals['AH6'] = '=AG6/$AG$14'
            Totals['AH7'].number_format = '0.0%'
            Totals['AH7'] = '=AG7/$AG$14'
            Totals['AH8'].number_format = '0.0%'
            Totals['AH8'] = '=AG8/$AG$14'
            Totals['AH9'].number_format = '0.0%'
            Totals['AH9'] = '=AG9/$AG$14'
            Totals['AH10'].number_format = '0.0%'
            Totals['AH10'] = '=AG10/$AG$14'
            Totals['AH11'].number_format = '0.0%'
            Totals['AH11'] = '=AG11/$AG$14'
            Totals['AH12'].number_format = '0.0%'
            Totals['AH12'] = '=AG12/$AG$14'
            Totals['AH13'].number_format = '0.0%'
            Totals['AH13'] = '=AG13/$AG$14'
            Totals.delete_rows(15, 0)
            Totals.conditional_formatting.add('B3:AF13', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                        mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))
            Totals.conditional_formatting.add('AH3:AH13', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                         mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))

        elif Totals['A13'].value == "Grand Totals":
            Totals['AH2'] = 'Percent'
            Totals['AH3'].number_format = '0.0%'
            Totals['AH3'] = '=AG3/$AG$13'
            Totals['AH4'].number_format = '0.0%'
            Totals['AH4'] = '=AG4/$AG$13'
            Totals['AH5'].number_format = '0.0%'
            Totals['AH5'] = '=AG5/$AG$13'
            Totals['AH6'].number_format = '0.0%'
            Totals['AH6'] = '=AG6/$AG$13'
            Totals['AH7'].number_format = '0.0%'
            Totals['AH7'] = '=AG7/$AG$13'
            Totals['AH8'].number_format = '0.0%'
            Totals['AH8'] = '=AG8/$AG$13'
            Totals['AH9'].number_format = '0.0%'
            Totals['AH9'] = '=AG9/$AG$13'
            Totals['AH10'].number_format = '0.0%'
            Totals['AH10'] = '=AG10/$AG$13'
            Totals['AH11'].number_format = '0.0%'
            Totals['AH11'] = '=AG11/$AG$13'
            Totals['AH12'].number_format = '0.0%'
            Totals['AH12'] = '=AG12/$AG$13'
            Totals.delete_rows(14, 0)
            Totals.conditional_formatting.add('B3:AF12', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                        mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))
            Totals.conditional_formatting.add('AH3:AH12', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                         mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))

        elif Totals['A12'].value == "Grand Totals":
            Totals['AH2'] = 'Percent'
            Totals['AH3'].number_format = '0.0%'
            Totals['AH3'] = '=AG3/$AG$12'
            Totals['AH4'].number_format = '0.0%'
            Totals['AH4'] = '=AG4/$AG$12'
            Totals['AH5'].number_format = '0.0%'
            Totals['AH5'] = '=AG5/$AG$12'
            Totals['AH6'].number_format = '0.0%'
            Totals['AH6'] = '=AG6/$AG$12'
            Totals['AH7'].number_format = '0.0%'
            Totals['AH7'] = '=AG7/$AG$12'
            Totals['AH8'].number_format = '0.0%'
            Totals['AH8'] = '=AG8/$AG$12'
            Totals['AH9'].number_format = '0.0%'
            Totals['AH9'] = '=AG9/$AG$12'
            Totals['AH10'].number_format = '0.0%'
            Totals['AH10'] = '=AG10/$AG$12'
            Totals['AH11'].number_format = '0.0%'
            Totals['AH11'] = '=AG11/$AG$12'
            Totals.delete_rows(13, 0)
            Totals.conditional_formatting.add('B3:AF11', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                        mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))
            Totals.conditional_formatting.add('AH3:AH11', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                         mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))

        elif Totals['A11'].value == "Grand Totals":
            Totals['AH2'] = 'Percent'
            Totals['AH3'].number_format = '0.0%'
            Totals['AH3'] = '=AG3/$AG$11'
            Totals['AH4'].number_format = '0.0%'
            Totals['AH4'] = '=AG4/$AG$11'
            Totals['AH5'].number_format = '0.0%'
            Totals['AH5'] = '=AG5/$AG$11'
            Totals['AH6'].number_format = '0.0%'
            Totals['AH6'] = '=AG6/$AG$11'
            Totals['AH7'].number_format = '0.0%'
            Totals['AH7'] = '=AG7/$AG$11'
            Totals['AH8'].number_format = '0.0%'
            Totals['AH8'] = '=AG8/$AG$11'
            Totals['AH9'].number_format = '0.0%'
            Totals['AH9'] = '=AG9/$AG$11'
            Totals['AH10'].number_format = '0.0%'
            Totals['AH10'] = '=AG10/$AG$11'
            Totals.delete_rows(12, 0)
            Totals.conditional_formatting.add('B3:AF10', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                        mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))
            Totals.conditional_formatting.add('AH3:AH10', ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571',
                                                                         mid_type='percentile', mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59'))

我的导入让我了解我正在使用什么。

import pandas as pd
import numpy as np
import sys
import openpyxl
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
from openpyxl.formatting.rule import ColorScale, ColorScaleRule, CellIsRule, FormulaRule
from openpyxl.utils import get_column_letter

我做了一些重构,我的一个问题是我不知道如何循环遍历列并将一系列列更改为百分比。 这不是全部,但我希望这可以帮助那里的人,我将继续努力做一些非常精简的事情。 我还必须添加一些导入。

import pandas as pd
import numpy as np
import sys
import openpyxl
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
from openpyxl.styles.numbers import NumberFormat
from openpyxl.formatting.rule import ColorScale, ColorScaleRule, CellIsRule, FormulaRule, DifferentialStyle, Rule
from openpyxl.utils import get_column_letter

和以前一样,这是 31 天。

    Totals = wb['Totals']
    Totals['A2'] = 'Totals'

    # This code sets Red/Yellow/Green pattern for both the table and percentages columns.
    setTableColorPattern = ColorScaleRule(start_type='percentile', start_value=10, start_color='54C571', mid_type='percentile',
                                          mid_value=50, mid_color='FFF380', end_type='percentile', end_value=90, end_color='F75D59')

    # This section matches 31 days at AG2, the nested if/elif cover the varing row lengths.
    if Totals['AG2'].value == "Grand Totals":
        Totals['AH2'] = 'Percent'

        diff_style = DifferentialStyle(
            numFmt=NumberFormat(numFmtId='4', formatCode='0.0%'))
        rule1 = Rule(type="expression", dxf=diff_style)
        rule1.formula = ["=NOT(ISBLANK($AG2))"]
        # provide a range of cells to change to percent.
        Totals.conditional_formatting.add(
            "$AH3:$AH14", rule1)

        if Totals['A7'].value == "Grand Totals":
            # Setting Column Name to Percent.
            # Creating the Percent column with each row divided into the total.
            Totals['AH3'] = '=AG3/$AG$7'
            Totals['AH4'] = '=AG4/$AG$7'
            Totals['AH5'] = '=AG5/$AG$7'
            Totals['AH6'] = '=AG6/$AG$7'
            Totals.delete_rows(8, 0)
            # Setting the color pattern for the main table.
            Totals.conditional_formatting.add(
                'B3:AF6', setTableColorPattern)
            # Setting the color pattern for the Percent column.
            Totals.conditional_formatting.add(
                'AH3:AH6', setTableColorPattern)

        elif Totals['A8'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$8'
            Totals['AH4'] = '=AG4/$AG$8'
            Totals['AH5'] = '=AG5/$AG$8'
            Totals['AH6'] = '=AG6/$AG$8'
            Totals['AH7'] = '=AG7/$AG$8'
            Totals.delete_rows(9, 0)
            Totals.conditional_formatting.add(
                'B3:AF7', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH7', setTableColorPattern)

        elif Totals['A9'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$9'
            Totals['AH4'] = '=AG4/$AG$9'
            Totals['AH5'] = '=AG5/$AG$9'
            Totals['AH6'] = '=AG6/$AG$9'
            Totals['AH7'] = '=AG7/$AG$9'
            Totals['AH8'] = '=AG8/$AG$9'
            Totals.delete_rows(10, 0)
            Totals.conditional_formatting.add(
                'B3:AF8', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH8', setTableColorPattern)

        elif Totals['A10'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$10'
            Totals['AH4'] = '=AG4/$AG$10'
            Totals['AH5'] = '=AG5/$AG$10'
            Totals['AH6'] = '=AG6/$AG$10'
            Totals['AH7'] = '=AG7/$AG$10'
            Totals['AH8'] = '=AG8/$AG$10'
            Totals['AH9'] = '=AG9/$AG$10'
            Totals.delete_rows(11, 0)
            Totals.conditional_formatting.add(
                'B3:AF9', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH9', setTableColorPattern)

        elif Totals['A11'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$11'
            Totals['AH4'] = '=AG4/$AG$11'
            Totals['AH5'] = '=AG5/$AG$11'
            Totals['AH6'] = '=AG6/$AG$11'
            Totals['AH7'] = '=AG7/$AG$11'
            Totals['AH8'] = '=AG8/$AG$11'
            Totals['AH9'] = '=AG9/$AG$11'
            Totals['AH10'] = '=AG10/$AG$11'
            Totals.delete_rows(12, 0)
            Totals.conditional_formatting.add(
                'B3:AF10', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH10', setTableColorPattern)

        elif Totals['A12'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$12'
            Totals['AH4'] = '=AG4/$AG$12'
            Totals['AH5'] = '=AG5/$AG$12'
            Totals['AH6'] = '=AG6/$AG$12'
            Totals['AH7'] = '=AG7/$AG$12'
            Totals['AH8'] = '=AG8/$AG$12'
            Totals['AH9'] = '=AG9/$AG$12'
            Totals['AH10'] = '=AG10/$AG$12'
            Totals['AH11'] = '=AG11/$AG$12'
            Totals.delete_rows(13, 0)
            Totals.conditional_formatting.add(
                'B3:AF11', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH11', setTableColorPattern)

        elif Totals['A13'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$13'
            Totals['AH4'] = '=AG4/$AG$13'
            Totals['AH5'] = '=AG5/$AG$13'
            Totals['AH6'] = '=AG6/$AG$13'
            Totals['AH7'] = '=AG7/$AG$13'
            Totals['AH8'] = '=AG8/$AG$13'
            Totals['AH9'] = '=AG9/$AG$13'
            Totals['AH10'] = '=AG10/$AG$13'
            Totals['AH11'] = '=AG11/$AG$13'
            Totals['AH12'] = '=AG12/$AG$13'
            Totals.delete_rows(14, 0)
            Totals.conditional_formatting.add(
                'B3:AF12', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH12', setTableColorPattern)

        elif Totals['A14'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$14'
            Totals['AH4'] = '=AG4/$AG$14'
            Totals['AH5'] = '=AG5/$AG$14'
            Totals['AH6'] = '=AG6/$AG$14'
            Totals['AH7'] = '=AG7/$AG$14'
            Totals['AH8'] = '=AG8/$AG$14'
            Totals['AH9'] = '=AG9/$AG$14'
            Totals['AH10'] = '=AG10/$AG$14'
            Totals['AH11'] = '=AG11/$AG$14'
            Totals['AH12'] = '=AG12/$AG$14'
            Totals['AH13'] = '=AG13/$AG$14'
            Totals.delete_rows(15, 0)
            Totals.conditional_formatting.add(
                'B3:AF13', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH13', setTableColorPattern)

        elif Totals['A15'].value == "Grand Totals":
            Totals['AH3'] = '=AG3/$AG$15'
            Totals['AH4'] = '=AG4/$AG$15'
            Totals['AH5'] = '=AG5/$AG$15'
            Totals['AH6'] = '=AG6/$AG$15'
            Totals['AH7'] = '=AG7/$AG$15'
            Totals['AH8'] = '=AG8/$AG$15'
            Totals['AH9'] = '=AG9/$AG$15'
            Totals['AH10'] = '=AG10/$AG$15'
            Totals['AH11'] = '=AG11/$AG$15'
            Totals['AH12'] = '=AG12/$AG$15'
            Totals['AH13'] = '=AG13/$AG$15'
            Totals['AH14'] = '=AG14/$AG$15'
            Totals.conditional_formatting.add(
                'B3:AF14', setTableColorPattern)
            Totals.conditional_formatting.add(
                'AH3:AH14', setTableColorPattern)

现在开始处理每个部分,我正在考虑尝试为 setMonth 和 setRow 拆分 function。 我会张贴我所拥有的。 正如我所说,如果有任何指示,我愿意接受任何建议。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM