wd-rating/mods/rate/utils/rate_utils.py

48 lines
1.6 KiB
Python

from copy import deepcopy
import pandas as pd
import string
from ..config import rate_wb_config
def get_cell_by_key(sheet, key):
value = sheet.iloc[int(key[1:]) - 1, string.ascii_uppercase.index(key[0])]
return None if pd.isna(value) else value
def sheet_parse(sheet_file, wb_config=rate_wb_config):
wb_data = deepcopy(wb_config)
wb = pd.read_excel(sheet_file, sheet_name=None, header=None)
for name, sheet in wb.items():
sheet_data = wb_data['sheets'].get(name)
if sheet_data:
for key, cell in sheet_data['cellMap'].items():
if cell.get('type') == 'value':
cell['value'] = get_cell_by_key(sheet, key)
else:
pass
return wb_data
def wb_data_check(wb_data, wb_config=rate_wb_config) -> (bool, str):
if not wb_data:
return False, "数据为空"
for sheet_key, sheet_data in wb_data['sheets'].items():
for key, cell in sheet_data['cellMap'].items():
if cell.get('type') == 'value':
if cell.get('config', {}).get('required'):
if cell.get('value') is None:
return False, f'{sheet_key}-{key}-{cell.get("config", {}).get("name", {})}缺失'
return True, ''
def parse_sheet_from_value_position(wb_data, sheet_name, value_position):
sheet = wb_data['sheets'][sheet_name]
value_dict = {}
for key, positions in value_position.items():
if type(positions) == list:
value_dict[key] = [sheet['cellMap'][position]['value'] for position in positions]
else:
value_dict[key] = sheet['cellMap'][positions]['value']
return value_dict