Как лучше забрать значение формулы в Excel таблице через pandas?

Ссылка скопирована
0 ответов

По вводным: у меня есть функция, которая забирает данные из ексель таблицы и вставляет их в.docx документ, все данные четко забираются, кроме тех в которых есть ВПР формула, а именно значения section и dimensions

По вводным: section - =ВПР(RC[-1];R2C21:R16C22;2;1)
По вводным: dimensions - =ВПР(RC[-1];R18C21:R26C22;2;1)

Код:

def safe_get_number(value): if pd.isna(value) or value == "": return None try: num = float(str(value).replace(',', '.')) return int(num) if num.is_integer() else num except (ValueError, TypeError): return None async def process_matching_row(row, shu_number, index, message, bot): try: name_of_the_unit = row.iloc[2] if len(row) > 2 else "Не указано" serial_number = row.iloc[3] if len(row) > 3 else "Не указано" ip = int(row.iloc[18]) if len(row) > 17 else "Не указано" weight = safe_get_number(row.iloc[15]) if len(row) > 15 else None weight_display = f"{weight} кг" if weight is not None else "Не указано" A = row.iloc[4] if len(row) > 4 else "Не указано" section = row.iloc[6] if len(row) > 6 else "Не указано" # тут формула ВПР (выдает nan) voltage = int(row.iloc[8] if len(row) > 8 else "Не указано") rated_A = row.iloc[4] if len(row) > 4 else "Не указано" dimensions = row.iloc[14] if len(row) > 6 else "Не указано". #тут формула ВПР (выдает nan) sn = row.iloc[16] if len(row) > 16 else "Не указано" logger.info(row) try: doc = Document(passport_config.get_target_file()) replacements = { "Заводской номер:": f"Заводской номер: {str(serial_number)}", "Проект №": f"Проект № ШУ {shu_number}", "Шкаф №": f"Шкаф {str(name_of_the_unit)}", "Дата:": f"Дата: {datetime.now().strftime('%d.%m.%Y')}", "IP": f"IP{ip}", "A": f"{A}A", "`": f"{section}мм2", "~": f"{dimensions}мм", "± 10 %": f"{voltage}± 10 %", "}": f"{weight}кг", "{": f"{sn}" } def replace_text_with_style(paragraph, old_text, new_text): if old_text in paragraph.text: for run in paragraph.runs: if old_text in run.text: run.text = run.text.replace(old_text, new_text) for paragraph in doc.paragraphs: for old_text, new_text in replacements.items(): replace_text_with_style(paragraph, old_text, new_text) for table in doc.tables: for row in table.rows: for cell in row.cells: for paragraph in cell.paragraphs: for old_text, new_text in replacements.items(): replace_text_with_style(paragraph, old_text, new_text) output_filename = f"ШУ_{shu_number}_{serial_number}.docx" desktop_path = SHUConfig.get_directory_path() pattern = re.compile(r".*ШУ\s*" + re.escape(str(shu_number)) + r"\D*$", re.IGNORECASE) matching_folders = [] for folder_name in os.listdir(desktop_path): if pattern.search(folder_name): matching_folders.append(folder_name) save_path = "." if matching_folders: matching_folders.sort(reverse=True) folder_path = os.path.join(desktop_path, matching_folders[0]) pasporta_path = os.path.join(folder_path, "Паспорта") try: os.makedirs(pasporta_path, exist_ok=True) save_path = pasporta_path except Exception as e: save_path = folder_path output_path = os.path.join(save_path, output_filename) doc.save(output_path) logger.info(Fore.GREEN + f"✓ Документ сохранен: {output_path}" + Style.RESET_ALL) if matching_folders: pdf_file = None elektrika_path = os.path.join(folder_path, "электрика") if os.path.exists(elektrika_path): pdf_files = [f for f in os.listdir(elektrika_path) if f.lower().endswith('.pdf') and f.startswith('1')] if pdf_files: pdf_files.sort() pdf_file = os.path.join(elektrika_path, pdf_files[0]) if not pdf_file: pdf_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.pdf') and f.startswith('1')] if pdf_files: pdf_files.sort() pdf_file = os.path.join(folder_path, pdf_files[0]) if pdf_file: if await process_pdf_attachment(pdf_file, pasporta_path, message, bot, shu_number): else: await bot.send_message(message.from_user.id, "Не найден PDF файл электрики!") except Exception as e: await bot.send_message(ADMIN_ID, f"× Ошибка в замене шаблона: {str(e)}") logger.error(Fore.RED + f"× Ошибка: {str(e)}" + Style.RESET_ALL) except Exception as e: await bot.send_message(ADMIN_ID, f"Ошибка при обработке строки {index + 1}: {e}") logger.error(Fore.RED + f"Ошибка при обработке строки {index + 1}: {e}" + Style.RESET_ALL) async def find_in_register(file_path, shu_number, message, bot): try: df = pd.read_excel(file_path) pattern = fr'(?:^|\b)ШУ\s*{re.escape(shu_number)}(?:\b|$)' mask = df.apply(lambda col: col.astype(str).str.contains(pattern, regex=True)).any(axis=1) matching_rows = df[mask] if not matching_rows.empty: logger.info(Fore.YELLOW + f"\nВсего найдено {len(matching_rows)} совпадений в реестре для ШУ{shu_number}:" + Style.RESET_ALL) for i, (_, row) in enumerate(matching_rows.iterrows()): await process_matching_row(row, shu_number, i, message, bot) else: await bot.send_message(message.from_user.id, f"\nВ реестре не найдено записей для ШУ{shu_number}") except Exception as e: await bot.send_message(message.from_user.id, f"Ошибка при поиске в реестре: {e}")
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно