Циклы. Импорт Excel файлов
Использование циклов в бизнес процессах. Чтение данных из файлов Excel
Для работы с файлом Excel автоматически созданных эндпойнтов уже недостаточно, нужно будет сделать свой. Вернемся в раздел создания бизнес-процессов для бэкенда и создадим новый БП под названием Import XLSX Data.
Циклы
Для понимания дальнейшего процесса необходимо немного отвлечься на теорию и разобраться с принципом работы циклов. Ранее все наши процессы шли только вперед. Они могли выбирать определенную развилку (на блоках If-Else и Switch), но мы точно знали, что каждый блок будет выполнен только один раз, возврата назад уже не будет.
Циклы дают возможность многократного повторения определенного участка. Процесс создается так, что выбранная последовательность блоков выполняется снова и снова. До тех пор, пока не будет выполнено условие прекращения цикла.
AppMaster дает возможность использования трех различных видов циклов. Принцип их работы абсолютно одинаков. Единственное что отличает их друг от друга - это условие завершения цикла.
- Loop. Самый простой из всех циклов. Его параметр Times (Integer) устанавливает фиксированное значение, сколько раз должен быть выполнен данный цикл.
- While loop. Цикл, который будет выполняться до тех пор, пока не будет выполнено определенное условие. Данное условие задается в параметре Condition (Boolean). В начале каждого цикла проверяется значение Condition, если оно True, то цикл выполняется, если False, то работа цикла прекращается. Параметр Limit (Integer) устанавливает предельное количество повторов цикла, чтобы гарантировать, что цикл не будет длиться вечно. По его достижению цикл закончится, независимо от значения Condition.
- For each loop. Цикл предназначенный для работы с массивами. В качестве входных данных получает массив (Array) и позволяет провести определенную операцию над каждым элементом данного массива. Выполняется столько раз, сколько элементов есть в массиве.
У каждого цикла есть два выходных потока.
- Loop Body. Само тело цикла. Тот процесс, который и будет повторяться необходимое число раз.
- Completed. Поток, который будет запущен по завершению работы цикла. Определяет, что делать дальше, после того, как цикл закончен. Кстати, любой цикл можно завершить по команде, не дожидаясь выполнения изначальных условий. Для этого нужно лишь использовать блок Break Loop в нужном месте. Он сразу переведет поток на Completed.
Чтение файла XLSX
Для анализа файла xlsx мы воспользуемся блоком Read XLSX File. Его принцип работы практически аналогичен блоку For each loop. Табличный файл он представляет в виде массива строк. А каждая строка, в свою очередь, тоже является массивом, но уже массивом ячеек данной строки.
Сам файл xlsx представлен в подобном виде. В первом столбце расположено наименование раздела, а во втором информация, которая в этом разделе содержится. При этом мы заранее не знаем строку, где вообще информация записана, она может оказаться в любом произвольном месте. В данном примере биография указана во второй строке, а логин в восьмой, но строки и порядок их записи могут быть любыми.
Бизнес-процесс начинается с получения файла в качестве входящего параметра. Обратите внимание, что передается именно тип данных file, то есть ID файла, а не весь файл целиком. Этот же file мы передаем в блок Read XLSX File.
Each row в данном случае - это аналог Loop Body. Это означает, что цикл будет выполнен столько раз, сколько строк есть в файле xlsx. При этом каждый цикл мы получаем информацию о том, какая же строка обрабатывается сейчас (Row number), а также о том, какие столбцы есть в данной строке (Row columns).
Наша задача состоит в том, чтобы проверять первый столбец каждой колонки. Мы рассчитываем найти ячейку в которой указано “Login” или “Bio”. Таким образом мы поймем, что нашли столбец с нужной информацией.
Для этого нам понадобится блок Array Element с индексом 0. Так мы получим содержимое первого столбца строки. После этого используем блок Switch для поиска нужного совпадения (Login, Bio).
Если такое совпадение не найдено, то цикл переходит к следующей итерации, к проверке следующей строки. Если же найдено, то мы понимаем, что во втором столбце данной ячейки должна быть необходимая нам информация и снова используем блок Array Element (но уже с индексом 1), чтобы эту информацию получить.
Остается только сохранить данную информацию. Ведь если не сделать этого сразу, то цикл просто пойдет дальше и полученные данные будут утеряны.
Переменные
Лучшим решением в данной ситуации станет использование переменных. Их смысл заключается в том, что определенные значения не передаются сразу из одного блока в другой, а сохраняются в памяти и используются при необходимости.
Для этого служат два блока:
- Блок переменной. Это может быть любое число, строка или даже массив объектов. Важно понять, что сам по себе этот блок ничего не делает, у него нет входных параметров. Он служит лишь для объявления того факта, что в памяти выделяется место для записи какого-то значения, с возможностью в дальнейшем снова обратиться к нему и узнать данное значение.
- Блок Set Variable, который предназначен для записи нового значения переменной.
В нашем случае мы определим две переменные типа String и запишем в них найденные значения. В одну поместим Login, а во вторую Bio. По завершению цикла нам нужно будет только передать значение из данных переменных в блок end.
Теперь стоит создать эндпойнт для готового бизнес-процесса и тем самым сделать его доступным для использования на фронте веб-приложения.
Итоговый результат
Итоговый бизнес процесс должен получиться таким:
Остаются последние штрихи для завершения создания приложения. Вернемся в бизнес-процесс фронтенда и доделаем его. Нам необходимо:
- Передать модель файла xlsx для записи на сервер.
- Развернуть полученный результат и получить ID файла.
- Передать данный ID в созданный ранее эндпойнт POST /xlsx-data/
- Воспользоваться полученными данными для отображения в соответствующих полях (а также для сброса параметра Disable, открывая возможность для редактирования)
Если все было сделано правильно, то итоговый вариант, после загрузки информации из файлов, должен выглядеть подобным образом.