🔍 Как найти информацию во всех вкладках Excel-файлов? Решение с помощью Python и OpenAI
Бывает так, что нужно найти одно конкретное значение в огромном Excel-файле, который состоит из десятков вкладок, а то и в нескольких таких файлах. Ручной просмотр каждой вкладки и каждой строки — это не только скучно, но и крайне неэффективно. Особенно, если вам нужно просто понять, где в этих файлах есть нужное слово, email, ИНН, или другая информация.
Решение? 💡 Написать умный скрипт на Python, который автоматически просматривает все листы во всех Excel-файлах, ищет нужную информацию и показывает:
🗂 Название файла
📄 Название и номер вкладки
📌 Номер строки и столбца, где была найдена информация
📋 Полное содержимое строки
И вы получаете результаты за секунды, а не за часы.
🛠 Что делает скрипт?
Автоматически находит все Excel-файлы в папке EXCLISX (.xls, .xlsx, .xlsm, .xlsb).
Открывает каждый файл и просматривает все вкладки.
Ищет заданный текст (например, email или ИНН) без учёта регистра — текст может быть в начале, середине или конце ячейки.
Выводит найденные совпадения в консоль.
Сохраняет результаты в удобном виде: TXT или Excel-файл (в папку Результат).
Работает даже с .xlsb файлами — через pyxlsb или xlwings.
✅ Пример, когда скрипт спасает время
У вас есть 5 Excel-файлов, в каждом по 10 листов, а на каждом листе — таблица с данными по сотрудникам, клиентам или заказам. Вам нужно быстро понять, где находится email example@gmail.com.
🔎 Этот скрипт найдёт его во всех листах, во всех строках, и покажет, где именно он спрятан.
🧠 Как он работает внутри?
На Python используется библиотека pandas для чтения Excel, а также pyxlsb или xlwings для работы с .xlsb файлами. При необходимости данные читаются через COM Excel, что позволяет обработать даже те форматы, которые pandas сам по себе не тянет.
Получите все совпадения на экране и в итоговом файле.
⏱ Время разработки?
С помощью 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("Неверный формат. Результаты не сохранены.")
Если остались вопросы, идеи или хочется доработать под свои задачи — пишите в комментарии, обсудим и подскажем. Всегда интересно поделиться опытом и упростить рутину.