Дисклеймер
Aхтунг! Данный кейс написан новичком: приведенные решения могут быть чрезмерно грубыми, а синтаксические решения лишены изящности.
Нигде в практике юриста не появляется столь острая необходимость в анализе данных, как в банкротных делах: в таких случаях порой нужно в кратчайшие сроки проанализировать большие объемы информации из банковских выписок, чтобы найти подозрительные транзакции или восстановить уничтоженную/спрятанную/подправленную бухгалтерскую отчетность.
Так как большинство выписок предоставляются банками в формате старых добрых excel-таблиц, возникло желание автоматизировать работу по поиску в них необходимой информации. Требовалось разработать такой инструмент, который позволяет:
Открыть нужную excel-таблицу и провести построковый и полистовой поиск значения по 1-3 ключевым словам, не заморачиваясь с инструментами самого MO Excel по сортировке и фильтру. Построковый поиск предпочтительный, чтобы позволить выводить всю интересующую транзакцию и проводить поиск по всем колонкам.
Обнаружив строки с ключевыми словами - перенести их значения в новую таблицу вместе с номером соответствующей строки.
В качестве инструмента для таких операций был выбран пайтоновский модуль openpyxl.
import openpyxl
from openpyxl import Workbook
bankstatetment = input('Введите название файла для анализа ') #просим указать имя файла в рабочей директории
#просим ввести ключевые для поиска слова
obj1= input('Введите ключевое слово ')
obj2= input('Введите ключевое слово ')
obj3= input('Введите ключевое слово ')
wb = openpyxl.load_workbook(bankstatetment) # загружаем выбранную выписку/файл
results_string_list = list() #создаем список, куда будет помещаться значение строк с ключевыми словами
results_stringrow_list = list() #создаем список, куда будет помещаться номер строки с ключевыми словами
Как я понял, посредством openpyxl нельзя перебирать листы таблицы - в каждом случае приходится прописывать, какой лист таблицы должен стать активным и точно указать его наименование. Конечный пользователь, в результате, будет вынужден удостовериться, что в проверяемом файле все листы названы как в программе "Лист 1", "Лист 2", "Лист 3".
Поиск ключевых слов в строках реализован через перебор значений ячеек в строках с помещением обнаруженных значений в два списка. В итоге у нас получаются два списка: results_string_list для значений строк и results_stringrow_list для номеров соответствующих строк. Так как добавление содержания и номера строки идет одновременно, их индексы в каждом списке будут совпадать, т.е. не нужно будет создавать словарь.
sheet = wb['Лист1'] #делаем активным первый лист таблицы.
for row in sheet: #перебор строк в листе
string = ''
for cell in row:
string = string + str(cell.value) + ' ' #определить значение в ячейках строки
string_row = str(cell.row)+ ' '#определить номер строки
if obj1 in string:
results_string_list.append (string) #добавляем значение строки в отдельный список
results_stringrow_list.append (string_row) #добавляем номер строки в отдельный список
if obj2 in string:
results_string_list.append (string)
results_stringrow_list.append (string_row)
if obj3 in string:
results_string_list.append (string)
results_stringrow_list.append (string_row)
Аналогичный код идет после установки в качестве активного второго листа страницы и далее. После приступаем к передаче найденных данных в новую таблицу:
wb = Workbook() #создаем новую таблицу
ws = wb.active #делаем новую таблицу активной
a1 = ws['A1']
a1.value = 'Содержание транзакции' #задаем значение подзаголовка колонки "А"
b1 = ws['B1']
b1.value = 'Номер строки с транзакцией' #задаем значение подзаголовка колонки "B"
Дальше пришлось сделать то, за что меня можно поругать: мы не знаем, сколько строк найдет программа, но так, как openpyxl позволяет только записывать значение в каждую ячейку, мы задаем для каждой ячейки колонок результатов свою переменную. Это создает лимит найденных ответов, зависящий от того, сколько ячеек мы прописали таким образом.
a2 = ws['A2']
a3 = ws['A3']
a4 = ws['A4']
a5 = ws['A5']
...
b2 = ws['B2']
b3 = ws['B3']
b4 = ws['B4']
b5 = ws['B5']
Далее выдергиваем каждый результат из списков посредством срезов и цикла for и "вписывая" каждое найденное значение сроки в новую ячейку колонки.
for i in results_string_list[0:1]:
a2.value = i
for i in results_string_list[1:2]:
a3.value = i
for i in results_string_list[2:3]:
a4.value = i
for i in results_string_list[3:4]:
a5.value = i
...
for i in results_stringrow_list[0:1]:
b2.value = i
for i in results_stringrow_list[1:2]:
b3.value = i
for i in results_stringrow_list[2:3]:
b4.value = i
for i in results_stringrow_list[3:4]:
b5.value = i
...
wb.save('результаты анализа.xlsx')
Возможно, существует более простой и изящный способ записи результатов в новую таблицу с помощью openpyxl, но такие, пока, мне неведомы.
P.S. При применении openpyxl поиск ключевых слов не был чувствителен к регистру, так что эту проблему решать не пришлось.
imengineer-org
Pandas умеет быстро и удобно данные из книг/листов Excel извлекать. По моему мнению, это более эффективный инструмент.
h0rn3t
Pandas под капотом использует openpyxl для xlsx