48 lines
1.6 KiB
Python
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
|