当用户输入公式时,中间使用加号作为分隔是不太方便的,因为加号在 Python 中有特殊的意义。但是我们可以采用其他方式来录入公式,并让系统自动识别和转换。
以下是更新后的代码示例:
import xlrd
def record_validation_rules(filename):
workbook = xlrd.open_workbook(filename)
sheet_validations = dict()
for sheet_name in workbook.sheet_names():
sheet = workbook.sheet_by_name(sheet_name)
row_validations = []
col_validations = []
# 用户输入行验证规则
while True:
row_rule = input(f"请输入需要验证的行规则(例如:6=7+16+31+38),输入N退出:")
if row_rule == 'N':
break
# 解析行规则
row_num, formula = row_rule.split('=')
row_num = int(row_num) - 1
row_validations.append((row_num, formula))
# 用户输入列验证规则
while True:
col_rule = input(f"请输入需要验证的列规则(例如:E=F+G+H+I),输入N退出:")
if col_rule == 'N':
break
# 解析列规则
col_letter, formula = col_rule.split('=')
col_num = xlrd.colname(col_letter) - 1
col_validations.append((col_num, formula))
sheet_validations[sheet_name] = {'rows': row_validations, 'cols': col_validations}
return sheet_validations
def validate_data(filename):
workbook = xlrd.open_workbook(filename)
error_msgs = []
for sheet_name, validations in record_validation_rules(filename).items():
sheet = workbook.sheet_by_name(sheet_name)
for row, formula in validations['rows']:
try:
result = eval(formula)
except (ValueError, IndexError, NameError):
error_msgs.append(f"Invalid value in Sheet '{sheet_name}', Row {row+1}, Formula '{formula}'")
for col, formula in validations['cols']:
try:
result = eval(formula)
except (ValueError, IndexError, NameError):
error_msgs.append(f"Invalid value in Sheet '{sheet_name}', Column '{xlrd.colname(col+1)}', Formula '{formula}'")
if error_msgs:
print("Validation Failed. Errors detected:")
for error in error_msgs:
print(error)
else:
print("Validation Successful. No errors detected.")
filename = "汇总表.xls"
validate_data(filename)
现在,用户可以直接输入类似 "6=7+16+31+38" 和 "E=F+G+H+I" 的格式来表示行和列的验证规则,系统会自动解析并转换为适合的数据结构。此外,只要用户不输入 "N",系统就会持续要求用户录入行(或列)的规则,并逐一转换留存。
希望这次的更新能够满足您的需求。如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |