我需要有关 Excel 中 Python 的帐单检查代码的帮助

I need help about bill checking code with Python in Excel

伙计们,我的目标是从用户那里获取多个浮点值输入,并检查 excel 文件夹中的值是否在用户给出的列和行范围内,例如 A1 到 A20,如果该值存在,我想将该单元格着色为绿色,如果它不存在,我想将其着色为红色。

所以问题是我设法处理了这个问题,但我无法从用户那里获取多个值来签入 Excel 文件夹,即使我在那个时间程序正在检查最后一个输入并保存为多个输入时也是如此最后输入的结果而不是其他输入的结果。我还需要检查是否有相同的值,如果它们存在我需要控制账单号码

这是我的代码

import openpyxl

from openpyxl.styles import PatternFill

from openpyxl import workbook

wrong_fill_pattern = PatternFill(patternType='solid', fgColor='FF0000')

right_fill_pattern = PatternFill(patternType='solid', fgColor='008000')

starting = (input("Bill Starting Spot `Sample A1` : "))

ending = (input("Bill Ending Spot 'Sample A20' : "))

wb = openpyxl.load_workbook('test.xlsx')

s = wb["Sheet1"]

billtocheck = float(input("Enter a bill : "))

for j in s[f'{starting}':f'{ending}']:
    for cel in j:

        print(cel.coordinate, cel.value)
        if cel.value == billtocheck:
            rightcoordinate = cel.coordinate
            s[f'{rightcoordinate}'].fill = right_fill_pattern
            print('+')
        else:
            wrongcoordinate = cel.coordinate
            s[f'{wrongcoordinate}'].fill = wrong_fill_pattern
            print("-")

    print('-------------')
wb.save("TEST2.xlsx")

它只是一个类似于原型的东西,我不能再集思广益了,因为我是新手,我找不到关于我的程序的正确的 openpyxl 信息(我知道有一个 openpyxl 网站,我检查过它) 有什么想法吗???

将用户输入的代码添加到现有代码中;

您可以更改 'bill' 的用户输入以接受多个值,然后将其包含在 'for' 循环中。 一些接受多个输入的方法可以通过以下方式实现;

  1. 让用户输入多个逗号(或您选择的分隔符) 分隔值并将其转换为浮点值列表。
  2. 让用户输入值,这些值被添加到列表中,直到他们 仅输入 'return'

下面的附加代码有两个选项,您可以注释掉每个选项以测试另一个。

对于选项 1,用户在提示时输入他们所有的帐单价值,用逗号分隔,例如;

Enter a bill : 5.5555,516.78,24.68,666.66,54.32,1.1111,10.999

当他们点击 'return' 时,输入被分配为字符串变量 'btc'。然后使用列表理解将此字符串变量转换为浮点列表 'btc_list'。

对于选项 2,一个连续的 While 循环会提示用户在提示时输入他们的帐单价值。然后代码检查是否输入了值并将该值附加到列表中,btc_list 作为浮点值。由于 While 循环保持为真,因此它会再次运行以提示用户输入一个值。 如果用户输入 'return' 而没有值,代码 'breaks' 将退出 While 循环。

在 for 循环中,之前针对单个输入值检查范围内的所有单元格(例如 A1:A20)。在 运行 此检查之前,添加了一个额外的级别以从 btc_list 中读取每个浮点值。

for billtocheck in btc_list:

如果找到匹配且背景变为绿色,则使用 'break' 终止对该单元格的检查,因此该单元格不会变回红色。

...
### Input Option 1 comma separated list 
btc = input("Enter a bill : ")
btc_list = [float(item) for item in btc.split(',')]

### Input Option 2 User enters values at prompt until 'return' only is entered 
# btc_list = []
# while True:
#     enter_bill = input("Enter a bill or return to exit : ")
#     if enter_bill == "":
#         break
#     else:
#         btc_list.append(float(enter_bill))

for j in s[f'{starting}':f'{ending}']:
    for cel in j:

        for billtocheck in btc_list:
            print(cel.coordinate, cel.value)
            if cel.value == billtocheck:
                rightcoordinate = cel.coordinate
                s[f'{rightcoordinate}'].fill = right_fill_pattern
                print('+')
                break
            else:
                wrongcoordinate = cel.coordinate
                s[f'{wrongcoordinate}'].fill = wrong_fill_pattern
                print("-")

    print('-------------')
wb.save("TEST2.xlsx")

如果单元格范围和帐单输入很大,则循环遍历每个帐单的范围可能需要一段时间。


用更少的处理实现相同结果的替代方法

这种实现相同结果的方法使用字典; range_dict,存储输入范围内的所有单元格,例如A1:A20。字典将为每个单元格包含一个条目,其中 'key' 是单元格坐标,值是单元格值。相同的循环最初还将所有单元格设置为红色背景。

在第二个循环中,我们遍历用户输入的账单列表。它检查是否在字典 range_dict 的任何地方找到账单值。如果是,那么我们使用一个名为 List Comprehension 的循环来获取所有出现的该账单值的键并将其放入列表中; found_list。添加到 found_list 的键是单元格坐标,因此我们可以遍历列表并将这些单元格更改为绿色(从我们之前将它们全部设置为红色背景)。 然后循环循环检查下一个账单值。

因此您可以看到,如果帐单值不在单元格范围内,则不会遍历所有单元格,if/then 测试

if btc in range_dict.values():

为 False,单元格仍为红色背景。

如果帐单值在单元格范围内,我们将获取所有匹配的单元格,然后循环遍历并将每个单元格更改为绿色背景。

...
btc = input("Enter a bill : ")
btc_list = [float(item) for item in btc.split(',')]

# Create the range_dict with all cells coordinate as key and cell value as value
range_dict = {}
for j in s[f'{starting}':f'{ending}']:
    for cel in j:
        range_dict[cel.coordinate] = cel.value
        s[f'{cel.coordinate}'].fill = wrong_fill_pattern

# Iterate thru the entered bills to check if exists in the range. If so change to green.  
for btc in btc_list:
    working_list = []
    if btc in range_dict.values():
        found_list = [key for key, value in range_dict.items() if value == btc]
        for celcoordinate in found_list:
            s[f'{celcoordinate}'].fill = right_fill_pattern

print('-------------')
wb.save("TEST2.xlsx")