Анализ банковских выписок в формате .xlsx с помощью Python и openpyxl

от автора

Дисклеймер

Aхтунг! Данный кейс написан новичком: приведенные решения могут быть чрезмерно грубыми, а синтаксические решения лишены изящности.

Нигде в практике юриста не появляется столь острая необходимость в анализе данных, как в банкротных делах: в таких случаях порой нужно в кратчайшие сроки проанализировать большие объемы информации из банковских выписок, чтобы найти подозрительные транзакции или восстановить уничтоженную/спрятанную/подправленную бухгалтерскую отчетность.

Так как большинство выписок предоставляются банками в формате старых добрых excel-таблиц, возникло желание автоматизировать работу по поиску в них необходимой информации. Требовалось разработать такой инструмент, который позволяет:

  1. Открыть нужную excel-таблицу и провести построковый и полистовой поиск значения по 1-3 ключевым словам, не заморачиваясь с инструментами самого MO Excel по сортировке и фильтру. Построковый поиск предпочтительный, чтобы позволить выводить всю интересующую транзакцию и проводить поиск по всем колонкам.

  2. Обнаружив строки с ключевыми словами — перенести их значения в новую таблицу вместе с номером соответствующей строки.

В качестве инструмента для таких операций был выбран пайтоновский модуль 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 поиск ключевых слов не был чувствителен к регистру, так что эту проблему решать не пришлось.

ссылка на оригинал статьи https://habr.com/ru/post/557022/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *