Python — Openpyxl — Поиск строкового значения в одном столбце, на нескольких листах. Как определить значение Null, None, False в цикле for

#python #python-3.x #openpyxl

#питон #python-3.x #openpyxl

Вопрос:

Поиск Строки В Файле Excel С Помощью Openpyxl — (Python 3.10)

Я ищу строку в столбце А в четырех листах. Сценарий работает, если значение ячейки найдено на листе.

Я хочу знать, как определить, не существует ли ячейки? (так что я могу выполнить поиск с использованием альтернативной строки).

Сценарий (я прикрепил фотографию результатов)

 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles import colors from openpyxl.cell import Cell import colorama from colorama import init init() from colorama import Fore, Style, Back import os import shutil import math from decimal import Decimal from openpyxl.styles import Alignment from inspect import currentframe import time  ######################################## #########################################  src_path ="/Users/data/" xlfileName = "test.xlsx" xlfile = src_path   xlfileName wb = Workbook() wb = load_workbook(xlfile)  ######################################### #########################################  def get_linenumber():  cf = currentframe()  return cf.f_back.f_lineno  ######################################### #########################################  ######################################### #########################################  for xws in wb.sheetnames:  worksheet = wb[xws]  print(Style.RESET_ALL)  print(Fore.BLUE, "Looping Through Worksheet Name -- ", worksheet, "Script line is -- ", get_linenumber())  print(Style.RESET_ALL)  for cell in worksheet['A']:  search_string33 = "Current debt" #  search_string34 = "test" #  try:  if search_string33 == cell.value:  offset_colB_CD = cell.offset(row=0, column=1)  print(Fore.RED, ( "Line 52 -- worksheet -- ", worksheet, "Searching for --", search_string33, "isinstance --", isinstance(search_string33, type(None))))  if(offset_colB_CD.coordinate is None):  print("Line 54 -- null value detected in -- ", worksheet)  elif(offset_colB_CD.coordinate is not None):  print(Fore.LIGHTRED_EX, "Line 56 -- worksheet -- ", worksheet," -- cell cordinate found --", offset_colB_CD.coordinate, " -- cell value found --", offset_colB_CD.value )  print(Style.RESET_ALL)  else:  print("Line 59 if statement passed by on else")  time.sleep(5)  except (AttributeError, TypeError):  continue    

поиск по строкам openpyxl

Ответ №1:

Быстрое решение, о котором я могу подумать, — это перебор списка строк в том порядке, в котором вы хотите их искать.

Пример:

 search_strings = ["Current debt", "test"]  for xws in wb.sheetnames:  worksheet = wb[xws]  print(Style.RESET_ALL)  print(Fore.BLUE, "Looping Through Worksheet Name -- ", worksheet, "Script line is -- ", get_linenumber())  print(Style.RESET_ALL)   current_search_index = 0  found_cell = False  for current_string in search_strings:  for cell in worksheet['A']:  try:  if current_string == cell.value:  offset_colB_CD = cell.offset(row=0, column=1)  print(Fore.RED, ( "Line 52 -- worksheet -- ", worksheet, "Searching for --", current_string, "isinstance --", isinstance(current_string, type(None))))  if(offset_colB_CD.coordinate is None):  print("Line 54 -- null value detected in -- ", worksheet)  elif(offset_colB_CD.coordinate is not None):  print(Fore.LIGHTRED_EX, "Line 56 -- worksheet -- ", worksheet," -- cell cordinate found --", offset_colB_CD.coordinate, " -- cell value found --", offset_colB_CD.value )  print(Style.RESET_ALL)  found_cell = True  else:  print("Line 59 if statement passed by on else")  time.sleep(5)  except (AttributeError, TypeError):  continue  if found_cell == False:  current_search_index  = 1  else:  break  if found_cell == False:  print(Fore.RED, "Line 67 -- ", current_string, "not found in -- ", worksheet)  print(Style.RESET_ALL)  

Комментарии:

1. Пока сценарий не сможет определить, какие листы не имеют значения в столбце A, он не сможет перейти к следующему шагу.

2. Взгляните на мою правку. Ты это имел в виду? Если он не сможет найти значение, он распечатает его, и вы сможете сломать или сделать с ним все, что захотите.

3. Это действительно сработало, но сделать это таким образом означало бы больше строк кода. Я хотел сделать все в пределах одного цикла на листе. Я ценю вашу помощь. Спасибо.

4. Если вы хотите сделать это в одном цикле, это не будет работать так, как вы объясняли раньше. Я не думаю, что то, что вы хотите, возможно без «большего количества строк кода» (что, на мой взгляд, в любом случае неплохо).

5. Я ответил на свой вопрос :о)

Ответ №2:

worksheet.values вернет список кортежей. На этом этапе мы можем сократить наш список, используя понимание списка и фильтрацию.

 matching_strs = ['Current_debt', 'test'] matches = [{'ws':ws, 'row_num':row_num, 'row':row} for ws in wb.worksheets for row_num, row in enumerate(ws.values) if row[0] in matching_strs]  

Это вернет список диктов с атрибутами ws, row_num, row. Который должен предоставить всю информацию, необходимую для распечатки результатов.

Нет необходимости во ( ) всех этих if тестах.

Чтобы распечатать результаты, просто выполните цикл и проверьте

  for match in matches:  # Return position [1] is the equivalent of column B  # since indexing starts at 0.  if match['row'][1]:  print( Match found... )  

Комментарии:

1. Я попытался сопоставить, openpyxl выдавал ошибки. лучшим вариантом было создать список, а затем подойти, чтобы посмотреть, содержит ли список строку.

2. хорошо — до тех пор, пока у вас есть что-то, что работает. Мне понадобится сообщение об ошибке, чтобы помочь помимо этого.

3. Поскольку я не могу прокомментировать ваше решение, я хочу отметить несколько вещей: for xws in wb.sheetnames вы уверены, что не можете позвонить в wb.worksheets ? Это уже предусмотрено для вас. Кроме того, с elif заявлениями. Вам не нужно проверять «search_str33 не в списке ячеек», это известно, так как он не прошел первый if тест.

Ответ №3:

Ответ На Вопрос

В моем первоначальном вопросе я не смог просмотреть количество элементов, непосредственно запрашиваемых в столбце. Таким образом, если прямое попадание не было достигнуто, он двигался дальше. Я не мог использовать «Нет», потому что в нем присутствовали другие элементы.

Лучшим вариантом было создать список, а затем отфильтровать его, чтобы увидеть, содержит ли он строку. Если он содержит строку, вызовите команду первого выбора, а если нет, вызовите альтернативную команду.

 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.styles import Color, PatternFill, Font, Border from openpyxl.styles import colors from openpyxl.cell import Cell import colorama from colorama import init init() from colorama import Fore, Style, Back import os import shutil import math from decimal import Decimal from openpyxl.styles import Alignment from inspect import currentframe import time  ######################################## #########################################  src_path ="/Users/data/" xlfileName = "test.xlsx" xlfile = src_path   xlfileName wb = Workbook() wb = load_workbook(xlfile)  ######################################### #########################################  def get_linenumber():  cf = currentframe()  return cf.f_back.f_lineno  ######################################### #########################################  ######################################### #########################################  for xws in wb.sheetnames:  worksheet = wb[xws]  print(Style.RESET_ALL)  print(Fore.BLUE, "Looping Through Worksheet Name -- ", worksheet, "Script line is -- ", get_linenumber())  print(Style.RESET_ALL)  search_string33 = "Current debt" #  search_string34 = "Total current liabilities"  cell_list = []  for cell in worksheet['A']:  cell_list.append(cell.value)  number_of_elements = len(cell_list)  print("Number of elements in the list: ", number_of_elements)  if search_string33 in cell_list :  print(Fore.GREEN, "Yes -- ", search_string33)  print(Style.RESET_ALL)  elif search_string33 not in cell_list and search_string34 in cell_list:  print(Fore.LIGHTMAGENTA_EX, "No -- ", search_string33, Fore.GREEN, "Yes -- ", search_string34)  print(Style.RESET_ALL)  elif search_string33 not in cell_list and search_string34 not in cell_list:  print(Fore.RED, "Mother of Holy Crap", search_string33)  print(Style.RESET_ALL)    

соответствие строк excel с помощью python