| | |
| | | |
| | | |
| | | def read_target(spec): |
| | | """è¯»ç®æ æç»è¡¨ â (è¡å表, 表头è¡å·, 说æ)""" |
| | | """è¯»ç®æ æç»è¡¨ â (è¡å表, å使 å°, åä½åè¦)ã |
| | | |
| | | åä½**æè¡¨å¤´å®ä½**ï¼æ¯çé»è®¤åä½åªä½å
åºï¼ï¼ä¸æ¯çé»è®¤ä¸ä¸è´æ¶è¿ååè¦ï¼ç±è°ç¨æ¹å¼¹çªã |
| | | """ |
| | | from openpyxl import load_workbook |
| | | import xlrd |
| | | rows = [] |
| | | rows, notes, infos, merges = [], [], [], [] |
| | | KEYF = ('项ç®åç§°', 'æ»æèµ', 'èªå¼å§å»ºè®¾ç´¯è®¡', 'æ¬å¹´è®¡åæèµ', 'èªå¹´å累计', 'æ¬æå®æ') |
| | | if spec['kind'] == 'xlsx': |
| | | wb = load_workbook(spec['path'], data_only=True) |
| | | ws = wb[spec['sheet']] |
| | | def cells(r, c): |
| | | return ws.cell(r, c).value |
| | | nrows, ncols = ws.max_row, ws.max_column |
| | | merges = [(r.min_row - 1, r.max_row, r.min_col - 1, r.max_col) |
| | | for r in ws.merged_cells.ranges] |
| | | else: |
| | | bk = xlrd.open_workbook(spec['path']) |
| | | try: |
| | | bk = xlrd.open_workbook(spec['path'], formatting_info=True) |
| | | except Exception: |
| | | bk = xlrd.open_workbook(spec['path']) |
| | | sh = bk.sheet_by_name(spec['sheet']) |
| | | def cells(r, c): |
| | | return sh.cell_value(r - 1, c - 1) if (r - 1 < sh.nrows and c - 1 < sh.ncols) else '' |
| | | nrows, ncols = sh.nrows, sh.ncols |
| | | namec = F.colindex(spec['name_col']) + 1 |
| | | anchors = [F.colindex(spec['cols'][k]) + 1 for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ»æèµ')] |
| | | merges = list(getattr(sh, 'merged_cells', []) or []) |
| | | |
| | | # 1) æè¡¨å¤´å®ä½åï¼ä¸¤çº§è¡¨å¤´ / åååé½å¨ pick_columns éæ¶æ§ï¼ |
| | | cols = {} |
| | | try: |
| | | _c, _h = F.pick_columns(lambda r, c: cells(r + 1, c + 1), nrows, ncols, merges) |
| | | for k in spec['cols']: |
| | | if k in _c: |
| | | cols[k] = F.colname(_c[k]) |
| | | except Exception as e: |
| | | notes.append('表头å®ä½å¼å¸¸(%s: %s)ï¼å
¨é¨é忝çé»è®¤åä½' % (type(e).__name__, str(e)[:40])) |
| | | # 2) æªæ¾å°çé忝çé»è®¤åä½ï¼ä¸é»è®¤ä¸ä¸è´çè®°å½åè¦ï¼å
³é®åï¼/æç¤ºï¼å
¶ä½åï¼ |
| | | for k, exp in spec['cols'].items(): |
| | | got = cols.get(k) |
| | | if got is None: |
| | | msg = '%sï¼è¡¨å¤´æªæ¾å°ï¼ææ¯çé»è®¤ %s å' % (k, exp) |
| | | (notes if k in KEYF else infos).append(msg) |
| | | cols[k] = exp |
| | | elif got != exp: |
| | | msg = '%sï¼è¡¨å¤´å®ä½ %s åï¼æ¯çé»è®¤ %s å' % (k, got, exp) |
| | | (notes if k in KEYF else infos).append(msg) |
| | | |
| | | namec = F.colindex(cols['项ç®åç§°']) + 1 |
| | | anchors = [F.colindex(cols[k]) + 1 for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ»æèµ') if k in cols] |
| | | for r in range(1, nrows + 1): |
| | | name = str(cells(r, namec) or '').strip() |
| | | a = str(cells(r, 1) or '').strip() |
| | |
| | | if not any(to_num(cells(r, c)) is not None for c in anchors): |
| | | continue |
| | | rec = {'ç®æ è¡å·': r, 'å¸å·æè¡é¦': a} |
| | | for k, col in spec['cols'].items(): |
| | | v = cells(r, F.colindex(col) + 1) |
| | | for k in spec['cols']: |
| | | v = cells(r, F.colindex(cols[k]) + 1) |
| | | rec[k] = pretty(to_num(v)) if k in NUMF else str(v or '').strip() |
| | | rows.append(rec) |
| | | return rows |
| | | return rows, cols, notes, infos |
| | | |
| | | |
| | | def read_system(path): |
| | |
| | | add_alert('黿' if st.startswith('è§£æå¤±è´¥') else 'è¦å', 'æºæä»¶è§£æå¼å¸¸', |
| | | ck.get('åç±»', ''), ck.get('å¸å·', ''), '', ck.get('æä»¶', ''), |
| | | st, '人工æå¼æºæä»¶ç¡®è®¤è¡¨å¤´/æ°æ®ï¼å¿
è¦æ¶ç»è®°ç¹ä¾åå导å
¥') |
| | | elif ck.get('åä½') and not all(k in ck['åä½'] for k in ('èªå¼å§å»ºè®¾ç´¯è®¡=', 'èªå¹´å累计=', 'æ¬æå®æ=')): |
| | | _miss = [k for k in ('èªå¼å§å»ºè®¾ç´¯è®¡', 'èªå¹´å累计', 'æ¬æå®æ') if k + '=' not in ck['åä½']] |
| | | add_alert('è¦å', 'æºæä»¶ç¼ºå
³é®å', ck.get('åç±»', ''), ck.get('å¸å·', ''), '', ck.get('æä»¶', ''), |
| | | 'æè¡¨å¤´æ²¡æ¾å°åï¼%sï¼å®é
è¯å«å°çåä½ï¼%sï¼' % ('ã'.join(_miss), ck['åä½']), |
| | | 'äººå·¥ç¡®è®¤æºæä»¶è¡¨å¤´æ¯å¦è¢«æ¹è¿ï¼å¿
è¦æ¶ç»è®°ä¸ºç¹ä¾') |
| | | elif ck.get('ä¸è´æ§', '') == 'â ï¸ ä¸ä¸è´': |
| | | add_alert('è¦å', 'æºæä»¶å
é¨å¯¹ä¸ä¸', ck.get('åç±»', ''), ck.get('å¸å·', ''), '', ck.get('æä»¶', ''), |
| | | '项ç®è¡æ±å %s/%s/%s â %s è¡å计 %s/%s/%s' % ( |
| | |
| | | add_alert('黿', 'ç¼ºç®æ æç»è¡¨', cat, '', '', spec['path'], |
| | | 'ç®æ æç»è¡¨ä¸åå¨ï¼æ¬å£åº¦è¯¥åç±»æ æ³åå
¥', 'ææ¨¡æ¿è¡¨æ¾å° docs\\æèµ\\è¾åº\\') |
| | | continue |
| | | tgt = read_target(spec) |
| | | tgt, tcols, tnotes, tinfos = read_target(spec) |
| | | if tnotes: |
| | | add_alert('è¦å', 'ç®æ 表åä½ç½®ä¸é¢æä¸ç¬¦', cat, '', '', os.path.basename(spec['path']), |
| | | 'ï¼'.join(tnotes[:8]), |
| | | '确认æ¯ç表头æ¯å¦è¢«æ¹å¨ï¼ç¨åºå·²æè¡¨å¤´å®ä½ï¼ä½è¯·äººå·¥æ ¸å¯¹åååå
¥') |
| | | if tinfos: |
| | | add_alert('æç¤º', 'ç®æ 表个å«åææ¯çé»è®¤', cat, '', '', os.path.basename(spec['path']), |
| | | 'ï¼'.join(tinfos[:8]), |
| | | 'ç¥æå³å¯ï¼è¿äºå卿¯ç鿬æ¥å°±æ²¡æåè¡¨å¤´ï¼æé»è®¤åä½åå
¥ï¼') |
| | | prow = [r for r in parsed if r['åç±»'] == cat] |
| | | tmap = {} |
| | | for t in tgt: |