Привет всем! Интересный вопрос был задан мне в Telegram несколько дней назад. В целом, он сводился к задаче, которая звучала как: поиск в Excel-файле. Давайте попробуем ее решить? 🙂
Собственно, любой Excel-файл — это некоторое количество строк и колонок. Работаем, как всегда — с помощью библиотеки Openpyxl, а для работы с каждой отдельной ячейкой — используем цикл while.
В целом, алгоритм работы кода сводится к:
1. Открываем файл (об этом я писал ранее)
2. Читаем первую ячейку в строке
3. Переходим к следующей строке в этом столбце
4. После того, как достигли максимума по количеству ячеек в столбце — переходим к следующему столбцу.
5. И так до полной обработки файла.
Важно: для того, что бы цикл работал — нам нужно знать количество ячеек в строках и в столбцах. Для этого используем конструкции в виде:
-
row_max = sheet_active.max_row # Получаем количество столбцов
и
-
column_max = sheet_active.max_column # Получаем количество строк
Сам код с комментариями — доступен ниже.
-
import openpyxl
-
from openpyxl.utils import get_column_letter
-
import re
-
-
path_to_file = 'base_to_search.xlsx'
-
-
search_text = input(str('Какой текст ищем: '))
-
search_text = search_text.lower()
-
print('Ищем:', search_text)
-
-
wb = openpyxl.load_workbook(path_to_file) # Грузим наш прайс-лист
-
sheets_list = wb.sheetnames # Получаем список всех листов в файле
-
sheet_active = wb[sheets_list[0]] # Начинаем работать с самым первым
-
row_max = sheet_active.max_row # Получаем количество столбцов
-
#print(type(row_max))
-
column_max = sheet_active.max_column # Получаем количество строк
-
-
print('В файле:', path_to_file, '\n Cтолбцов:', row_max, '\n Колонок:', column_max)
-
-
row_min = 1 #Переменная, отвечающая за номер строки
-
column_min = 1 #Переменная, отвечающая за номер столбца
-
-
while column_min <= column_max:
-
row_min_min = row_min
-
row_max_max = row_max
-
while row_min_min <= row_max_max:
-
row_min_min = str(row_min_min)
-
-
word_column = get_column_letter(column_min)
-
word_column = str(word_column)
-
word_cell = word_column + row_min_min
-
-
data_from_cell = sheet_active[word_cell].value
-
data_from_cell = str(data_from_cell)
-
#print(data_from_cell)
-
regular = search_text
-
result = re.findall(regular, data_from_cell)
-
if len(result) > 0:
-
print('Нашли в ячейке:', word_cell)
-
row_min_min = int(row_min_min)
-
row_min_min = row_min_min + 1
-
column_min = column_min + 1
Конечно, я буду рад любым комментариям и вопросам. Для этого используйте почту или Telegram.