🔍 Как найти информацию во всех вкладках Excel-файлов? Решение с помощью Python и OpenAI

Бывает так, что нужно найти одно конкретное значение в огромном Excel-файле, который состоит из десятков вкладок, а то и в нескольких таких файлах. Ручной просмотр каждой вкладки и каждой строки — это не только скучно, но и крайне неэффективно. Особенно, если вам нужно просто понять, где в этих файлах есть нужное слово, email, ИНН, или другая информация.

Решение? 💡 Написать умный скрипт на Python, который автоматически просматривает все листы во всех Excel-файлах, ищет нужную информацию и показывает:

  • 🗂 Название файла
  • 📄 Название и номер вкладки
  • 📌 Номер строки и столбца, где была найдена информация
  • 📋 Полное содержимое строки

И вы получаете результаты за секунды, а не за часы.

🛠 Что делает скрипт?

  1. Автоматически находит все Excel-файлы в папке EXCLISX (.xls, .xlsx, .xlsm, .xlsb).
  2. Открывает каждый файл и просматривает все вкладки.
  3. Ищет заданный текст (например, email или ИНН) без учёта регистра — текст может быть в начале, середине или конце ячейки.
  4. Выводит найденные совпадения в консоль.
  5. Сохраняет результаты в удобном виде: TXT или Excel-файл (в папку Результат).
  6. Работает даже с .xlsb файлами — через pyxlsb или xlwings.

✅ Пример, когда скрипт спасает время

У вас есть 5 Excel-файлов, в каждом по 10 листов, а на каждом листе — таблица с данными по сотрудникам, клиентам или заказам. Вам нужно быстро понять, где находится email example@gmail.com.

🔎 Этот скрипт найдёт его во всех листах, во всех строках, и покажет, где именно он спрятан.

🧠 Как он работает внутри?

На Python используется библиотека pandas для чтения Excel, а также pyxlsb или xlwings для работы с .xlsb файлами. При необходимости данные читаются через COM Excel, что позволяет обработать даже те форматы, которые pandas сам по себе не тянет.

Ключевые технологии:

bashКопироватьРедактироватьpip install pandas openpyxl xlwings pyxlsb

📌 Пример запуска

  1. Поместите все нужные Excel-файлы в папку EXCLISX.
  2. Запустите скрипт main.py.
  3. Введите искомое слово (например, email).
  4. Получите все совпадения на экране и в итоговом файле.

⏱ Время разработки?

С помощью ChatGPT и Python — всего 22 минуты, чтобы получить рабочее решение, которое экономит десятки часов ручной работы в будущем.

🚀 Хочешь использовать сам?

Если хочешь получить готовый скрипт — просто открой main.py, вставь код (можно попросить ChatGPT повторить его), и используй для любых задач:

  • Поиск по огромным таблицам
  • Анализ вложенных данных
  • Контроль отчетов или экспортов
  • Быстрый аудит данных

✍ Заключение

Этот подход — не просто автоматизация. Это пример того, как можно сэкономить часы работы, применив простые инструменты и немного кода. И да, если ты уже работаешь с Excel — тебе больше не нужно искать вручную по вкладкам.

Просто запусти скрипт — и всё будет найдено за тебя.

КОД

import os import pandas as pd def search_excel(file_path, search_term): """ Читает Excel‑файл (все листы) и ищет заданный текст во всех ячейках без учёта регистра. Если файл имеет расширение .xlsb: - Сначала пытается использовать движок 'pyxlsb' (для этого должен быть установлен модуль pyxlsb). - Если pyxlsb не установлен, то при наличии модуля xlwings применяется альтернативный метод через xlwings. Возвращает список словарей с результатами, где для каждой найденной строки записывается: - FileName: имя файла - SheetName: имя листа - SheetNumber: порядковый номер листа (начиная с 1) - ExcelRow: номер строки в Excel (с учётом заголовка, поэтому +2) - RowData: данные строки в виде словаря - FoundColumns: список кортежей (название столбца, порядковый номер столбца), где найдено совпадение """ if file_path.lower().endswith('.xlsb'): try: # Пытаемся использовать pyxlsb import pyxlsb engine = 'pyxlsb' sheets_dict = pd.read_excel(file_path, sheet_name=None, engine=engine) return search_in_sheets(sheets_dict, search_term, os.path.basename(file_path)) except ImportError: print( f"Для чтения файла {file_path} требуется модуль pyxlsb. Попытка использовать xlwings в качестве альтернативы...") try: import xlwings as xw except ImportError: print(f"Для чтения файла {file_path} требуется модуль pyxlsb или xlwings. Установите один из них.") return [] return search_excel_xlsb_via_xlwings(file_path, search_term) except Exception as e: print("Ошибка при чтении файла:", file_path, e) return [] else: try: sheets_dict = pd.read_excel(file_path, sheet_name=None) return search_in_sheets(sheets_dict, search_term, os.path.basename(file_path)) except Exception as e: print("Ошибка при чтении файла:", file_path, e) return [] def search_in_sheets(sheets_dict, search_term, file_name): """ Универсальный поиск по словарю листов (key=имя листа, value=DataFrame). """ results = [] for sheet_index, (sheet_name, df) in enumerate(sheets_dict.items(), start=1): for row_index, row in df.iterrows(): found_columns = [] for col in df.columns: cell_value = str(row[col]) if search_term.lower() in cell_value.lower(): col_number = list(df.columns).index(col) + 1 found_columns.append((col, col_number)) if found_columns: excel_row_number = row_index + 2 # учитываем, что первая строка – заголовок results.append({ "FileName": file_name, "SheetName": sheet_name, "SheetNumber": sheet_index, "ExcelRow": excel_row_number, "RowData": row.to_dict(), "FoundColumns": found_columns }) return results def search_excel_xlsb_via_xlwings(file_path, search_term): """ Читает .xlsb файл через xlwings и ищет заданный текст во всех ячейках. Работает через COM (Excel должен быть установлен). """ results = [] try: import xlwings as xw app = xw.App(visible=False) wb = app.books.open(file_path) for sheet_index, sheet in enumerate(wb.sheets, start=1): data = sheet.used_range.value # может вернуть одиночное значение или список списков # Приводим data к виду списка списков if not isinstance(data, list): data = [[data]] elif data and not isinstance(data[0], list): data = [data] if not data: continue header = data[0] # первая строка – заголовок for row_index, row in enumerate(data[1:], start=1): found_columns = [] for col_index, cell in enumerate(row): cell_str = str(cell) if cell is not None else "" if search_term.lower() in cell_str.lower(): col_name = header[col_index] if col_index < len(header) else f"Column {col_index + 1}" found_columns.append((col_name, col_index + 1)) if found_columns: excel_row_number = row_index + 2 # 1-я строка – заголовок, данные с 2-й row_data = {} if header: for col_index, value in enumerate(row): if col_index < len(header): row_data[header[col_index]] = value else: row_data[f"Column {col_index + 1}"] = value else: for col_index, value in enumerate(row): row_data[f"Column {col_index + 1}"] = value results.append({ "FileName": os.path.basename(file_path), "SheetName": sheet.name, "SheetNumber": sheet_index, "ExcelRow": excel_row_number, "RowData": row_data, "FoundColumns": found_columns }) wb.close() app.quit() except Exception as e: print("Ошибка при обработке файла через xlwings:", file_path, e) return results def save_results_txt(results, output_path): """ Сохраняет результаты поиска в текстовый файл. """ with open(output_path, "w", encoding="utf-8") as f: for res in results: f.write(f"Файл: {res['FileName']}\n") f.write(f"Лист: {res['SheetName']} (Номер листа: {res['SheetNumber']})\n") f.write(f"Номер строки: {res['ExcelRow']}\n") cols_info = ", ".join([f"{col} (Столбец {col_num})" for col, col_num in res['FoundColumns']]) f.write("Найдено в столбцах: " + cols_info + "\n") f.write("Данные строки:\n") row_str = " | ".join([f"{key}: {value}" for key, value in res['RowData'].items()]) f.write(row_str + "\n") f.write("-" * 50 + "\n") print("Результаты сохранены в файле:", output_path) def save_results_excel(results, output_path): """ Сохраняет результаты поиска в Excel‑файл. """ records = [] for res in results: record = { "Файл": res["FileName"], "Лист": res["SheetName"], "Номер листа": res["SheetNumber"], "Номер строки": res["ExcelRow"], "Найдено в столбцах": "; ".join([f"{col} (Столбец {col_num})" for col, col_num in res["FoundColumns"]]) } record.update(res["RowData"]) records.append(record) df_results = pd.DataFrame(records) df_results.to_excel(output_path, index=False) print("Результаты сохранены в файле:", output_path) if __name__ == '__main__': # Папка с исходными Excel‑файлами folder = "EXCLISX" if not os.path.exists(folder): print("Папка не найдена:", folder) exit(1) # Получаем список Excel файлов (любые форматы: .xls, .xlsx, .xlsm, .xlsb), исключая временные файлы (начинающиеся с "~$") valid_extensions = ('.xls', '.xlsx', '.xlsm', '.xlsb') file_list = [f for f in os.listdir(folder) if f.lower().endswith(valid_extensions) and not f.startswith("~$")] if not file_list: print("В папке", folder, "не найдено Excel файлов.") exit(1) print("Найденные Excel файлы:") for i, file in enumerate(file_list, start=1): print(f"{i}. {file}") search_term = input("Введите искомый текст: ").strip() all_results = [] for file in file_list: file_path = os.path.join(folder, file) print("\nОбработка файла:", file) results = search_excel(file_path, search_term) if results: all_results.extend(results) if not all_results: print("\nНичего не найдено по заданному поисковому запросу.") else: print(f"\nНайдено {len(all_results)} совпадений:") for res in all_results: cols_info = ", ".join([f"{col} (Столбец {col_num})" for col, col_num in res['FoundColumns']]) print( f"Файл: {res['FileName']}, Лист: {res['SheetName']} (Номер листа: {res['SheetNumber']}), Строка: {res['ExcelRow']}, Найдено в столбцах: {cols_info}") print("Данные строки:") for key, value in res['RowData'].items(): print(f" {key}: {value}") print("-" * 50) save_format = input("\nСохранить результаты в формате txt или excel? (txt/excel): ").strip().lower() output_dir = "Результат" if not os.path.exists(output_dir): os.makedirs(output_dir) if save_format == "txt": output_file = os.path.join(output_dir, "results.txt") save_results_txt(all_results, output_file) elif save_format == "excel": output_file = os.path.join(output_dir, "results.xlsx") save_results_excel(all_results, output_file) else: print("Неверный формат. Результаты не сохранены.")
🔍 Как найти информацию во всех вкладках Excel-файлов? Решение с помощью Python и OpenAI

Если остались вопросы, идеи или хочется доработать под свои задачи — пишите в комментарии, обсудим и подскажем. Всегда интересно поделиться опытом и упростить рутину.

1
Начать дискуссию