Openpyxl 如何检查列中的输入是否重复并验证?
Openpyxl how to check if input duplicates in column and validate?
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 Row `A1` : "))
ending = (input("Bill Ending Row `A20` : "))
wb = openpyxl.load_workbook('test.xlsx')
s = wb["Sheet1"]
billtocheck = input("Enter Bills : ")
billist = [float(item) for item in billtocheck.split(' ')]
for j in s[f'{starting}':f'{ending}']:
for cel in j:
for billtocheck in billist:
if cel.value == billtocheck:
print(cel.coordinate, cel.value)
rightcoordinate = cel.coordinate
s[f'{rightcoordinate}'].fill = right_fill_pattern
print('+')
wb.save("TEST2.xlsx")
break
if cel.value != billtocheck:
wrongcoordinate = cel.coordinate
s[f'{wrongcoordinate}'].fill = wrong_fill_pattern
print("-")
print('-------------')
wb.save("TEST2.xlsx")
此代码是一种票据验证程序。在此代码中,用户输入列和行的起点和终点,在该列和行的范围内,我想找到账单,如果值存在,它只会填充背景绿色(如果不是红色),它工作正常,但我遇到了另一个问题这有时是一个账单多次存在,我希望他们通过不同行中的账单号码进行验证。
The file example i am working on 如您在此 excel 文件中看到的,账单位于 E 列,账单编号位于 H 列,所以正如我所说,我只是想多次检查 E 列是否包含相同的值,我只想要那些多个值将用户放入确认部分以获得输入,这将是第一个输入,其中帐单编号位于列和行范围,例如 H1 到 H20,并获得多个输入,这将是帐单编号(如果有 3 次 64 ,04 和 2 次 52,02 程序将要求用户输入 5 次输入,这将是账单号码)。所以最后一件事是,如果账单号码与账单不匹配,它将把账单涂成红色,如果匹配则将其涂成绿色。
=想法=
为了确认重复的帐单并将它们彼此分开,当用户输入帐单编号时,它可以检查单元格坐标并尝试将其与重复值的行匹配,如果两者在同一行中,则匹配并确认。
使用当前代码,这将变得有些复杂,因为在给定范围内完成迭代之前,您可能不知道某个账单值是否在列中多次出现。我想您需要将每个 Bill Value 匹配项保存到一个列表中,然后检查该列表是否包含多个元素。如果不是,您可以将单元格涂成绿色,然后转到下一个帐单价值。如果确实如此,则要求提供 Bill Number 单元格范围和要检查的 Bill 编号。您必须循环匹配值,以便为每个匹配的单元格获取相应的账单编号,然后检查它是否与输入的账单编号相比较,如果相符,则将背景设为绿色。
如果你不熟悉,我想你会受益于学习列表和字典,这会让事情变得容易得多。
请检查您的原始问题,我已经提供了另一种方法来实现您当时的尝试。此代码使用字典和列表,可以更轻松地添加此附加检查。
例如,found_list 将立即确定是否有多个匹配您的帐单价值。
found_list = [key for key, value in range_dict.items() if value == btc]
if len(found_list) > 1:
您可以获得账单编号范围和值,然后 运行 一个循环检查来自 found_list 的账单值与用户输入的账单编号。
我还希望您只需要 letter/number 列作为账单编号而不是单元格范围。从您的示例 sheet 中,账单编号与价值在同一行,因此您只需要从与您当时检查的账单价值对应的正确单元格中获取值即可。
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 Row `A1` : "))
ending = (input("Bill Ending Row `A20` : "))
wb = openpyxl.load_workbook('test.xlsx')
s = wb["Sheet1"]
billtocheck = input("Enter Bills : ")
billist = [float(item) for item in billtocheck.split(' ')]
for j in s[f'{starting}':f'{ending}']:
for cel in j:
for billtocheck in billist:
if cel.value == billtocheck:
print(cel.coordinate, cel.value)
rightcoordinate = cel.coordinate
s[f'{rightcoordinate}'].fill = right_fill_pattern
print('+')
wb.save("TEST2.xlsx")
break
if cel.value != billtocheck:
wrongcoordinate = cel.coordinate
s[f'{wrongcoordinate}'].fill = wrong_fill_pattern
print("-")
print('-------------')
wb.save("TEST2.xlsx")
此代码是一种票据验证程序。在此代码中,用户输入列和行的起点和终点,在该列和行的范围内,我想找到账单,如果值存在,它只会填充背景绿色(如果不是红色),它工作正常,但我遇到了另一个问题这有时是一个账单多次存在,我希望他们通过不同行中的账单号码进行验证。 The file example i am working on 如您在此 excel 文件中看到的,账单位于 E 列,账单编号位于 H 列,所以正如我所说,我只是想多次检查 E 列是否包含相同的值,我只想要那些多个值将用户放入确认部分以获得输入,这将是第一个输入,其中帐单编号位于列和行范围,例如 H1 到 H20,并获得多个输入,这将是帐单编号(如果有 3 次 64 ,04 和 2 次 52,02 程序将要求用户输入 5 次输入,这将是账单号码)。所以最后一件事是,如果账单号码与账单不匹配,它将把账单涂成红色,如果匹配则将其涂成绿色。
=想法= 为了确认重复的帐单并将它们彼此分开,当用户输入帐单编号时,它可以检查单元格坐标并尝试将其与重复值的行匹配,如果两者在同一行中,则匹配并确认。
使用当前代码,这将变得有些复杂,因为在给定范围内完成迭代之前,您可能不知道某个账单值是否在列中多次出现。我想您需要将每个 Bill Value 匹配项保存到一个列表中,然后检查该列表是否包含多个元素。如果不是,您可以将单元格涂成绿色,然后转到下一个帐单价值。如果确实如此,则要求提供 Bill Number 单元格范围和要检查的 Bill 编号。您必须循环匹配值,以便为每个匹配的单元格获取相应的账单编号,然后检查它是否与输入的账单编号相比较,如果相符,则将背景设为绿色。
如果你不熟悉,我想你会受益于学习列表和字典,这会让事情变得容易得多。
请检查您的原始问题,我已经提供了另一种方法来实现您当时的尝试。此代码使用字典和列表,可以更轻松地添加此附加检查。
例如,found_list 将立即确定是否有多个匹配您的帐单价值。
found_list = [key for key, value in range_dict.items() if value == btc]
if len(found_list) > 1:
您可以获得账单编号范围和值,然后 运行 一个循环检查来自 found_list 的账单值与用户输入的账单编号。
我还希望您只需要 letter/number 列作为账单编号而不是单元格范围。从您的示例 sheet 中,账单编号与价值在同一行,因此您只需要从与您当时检查的账单价值对应的正确单元格中获取值即可。