import os import pandas as pd from openpyxl import load_workbook import pyautogui import time import subprocess SOURCE_TABLE = r'13. ВВОД в ПКЗО/Исходные данные для программы/Исходная таблица.xlsx' MIF_FOLDER = r'13. ВВОД в ПКЗО/Исходные данные для программы/все миф/' RESULT_TABLE = r'13. ВВОД в ПКЗО/Итоговая таблица пример.xlsx' ERRORS = { 'нет миф': 'НЕТ МИФ', 'площадь': 'площадь', 'нет кн': 'НЕТ КН', 'нет выписки': 'НЕТ ВЫПИСКИ', 'вид он': 'ВИД ОН', 'тип': 'ТИП', } class DataLoader: def __init__(self, source_table, mif_folder): self.source_table = source_table self.mif_folder = mif_folder self.df = pd.read_excel(self.source_table) def find_mif_file(self, kn): kn_variants = [ kn.replace(':', ' '), kn.replace(':', '_'), kn.replace(':', ''), ] for name in os.listdir(self.mif_folder): for variant in kn_variants: if variant in name and name.lower().endswith('.mif'): return os.path.join(self.mif_folder, name) return None def get_mif_area(self, mif_path): # Заглушка: возвращает None return None def make_comment(self, row): doc = str(row['Реквизиты и наименование документов - обоснование опр.границ']).strip() if not doc.endswith('.'): doc += '.' comment = doc + ' ' + str(row['Пояснения по границам']).strip() return comment def check_pkzo(self, kn, vid_on, type_on): # Заглушка: всегда возвращает True return True, True, True, True class PKZOAutomator: def __init__(self, pkzo_path=None): self.pkzo_path = pkzo_path or r'C:\Program Files\PKZO\pkzo.exe' def start_pkzo(self): if os.path.exists(self.pkzo_path): subprocess.Popen(self.pkzo_path) time.sleep(10) else: print('ПКЗО не найден, запустите вручную.') def automate_object(self, row, mif_path, comment): time.sleep(2) pyautogui.hotkey('ctrl', 'f') time.sleep(0.5) pyautogui.typewrite(str(row['КН'])) pyautogui.press('enter') time.sleep(1) pyautogui.rightClick() time.sleep(0.5) pyautogui.typewrite(['down', 'down', 'enter']) time.sleep(0.5) pyautogui.typewrite(mif_path) pyautogui.press('enter') time.sleep(1) pyautogui.rightClick() time.sleep(0.5) pyautogui.typewrite(['down', 'enter']) time.sleep(0.5) if str(row['Тип']).strip().lower() == 'уточнение': pyautogui.typewrite('уточняемый') else: pyautogui.typewrite('исправляемый') pyautogui.press('enter') time.sleep(1) pyautogui.doubleClick() time.sleep(0.5) pyautogui.typewrite(['tab', 'tab']) pyautogui.typewrite(comment) pyautogui.press('enter') time.sleep(1) def main(): loader = DataLoader(SOURCE_TABLE, MIF_FOLDER) automator = PKZOAutomator() automator.start_pkzo() results = [] for idx, row in loader.df.iterrows(): kn = str(row['КН']).strip() vid_on = str(row['Вид ОН']).strip() s_table = row['S определенная, кв.м.'] type_on = str(row['Тип']).strip().lower() errors = [] result = 'загружено' mif_path = loader.find_mif_file(kn) if not mif_path: result = 'не загружено' errors.append(ERRORS['нет миф']) else: if vid_on == 'ЗУ': s_mif = loader.get_mif_area(mif_path) if s_mif is not None and round(s_mif) != round(s_table): result = 'не загружено' errors.append(ERRORS['площадь']) pkzo_kn, pkzo_vyp, pkzo_vid, pkzo_type = loader.check_pkzo(kn, vid_on, type_on) if not pkzo_kn: result = 'не загружено' errors.append(ERRORS['нет кн']) if not pkzo_vyp: result = 'не загружено' errors.append(ERRORS['нет выписки']) if not pkzo_vid: result = 'не загружено' errors.append(ERRORS['вид он']) if not pkzo_type: result = 'не загружено' errors.append(ERRORS['тип']) if result == 'загружено' and not errors: comment = loader.make_comment(row) automator.automate_object(row, mif_path, comment) comment = loader.make_comment(row) results.append({ **row, 'Результат загрузки': result, 'Причина незагрузки': ', '.join(errors), 'Площадь по МИФ': None, 'Пояснения': comment, }) result_df = pd.DataFrame(results) result_df.to_excel(RESULT_TABLE, index=False) if __name__ == '__main__': main()