Готовим интерактивный чеклист в LibreOffice / OpenOffice Calc

В сегодняшней статье мы с вами создадим чеклист. Почему создание чеклиста я решил вывести в отдельный пост? Тут сыграл роль ряд факторов. Во-первых, статья будет ориентироваться на свободнораспространяемый (читай: бесплатный) офисный пакет LibreOffice (бывший OpenOffice). В современном мире все больше людей отказываются от всё еще сохраняющего своё могущество MS Excel. Во-вторых, я хотел показать, что создавать красивые и информативные интерактивные листы - это не такое уж и трудное дело. Потратив немного времени вы добьетесь того, что ваш чеклист, не только будет выполнять свою сугубо функциональную роль, но и произведет впечатление на людей, которые увидят его со стороны. В идеале у нас должно получиться что-то вроде этого:

libre office checklist

Тут я вынужден попросить прощение за то, что на видео не записались выпадающие списки, в колонке Step result. Почему-то мое ПО для записи экрана, не смогло их "увидеть"

Перед началом необходимо сделать еще ряд оговорок. Первая - в статье я использую версию LibreOffice 6.0.7.3. Не думаю, что эта функциональность часто меняется, но всё же имейте это в виду. Вторая - я использую англоязычную версию пакета. Поэтому, если у вас установлена русифицированная версия, вам будет необходимо сопоставить названия пунктов меню и, возможно, некоторых функций, самостоятельно.

Теперь можно начинать. Для примера, я подготовил небольшой чеклист. На его основе мы и будем рассматривать весь процесс.

Подготавливаем базу

Откройте LibreOffice Calc, скопируйте в буфер обмена то, что написано во врезке ниже, установите курсор на какую-нибудь ячейку (желательно, не на самую угловую, чтобы вокруг было немного свободного места), и вставьте скопированное из буфера обмена. Появится диалог вставки данных. Конфигурация по умолчанию должна подойти, поэтому просто подтвердите предложение.

Step No	Step Description	Step result
1	Read all the posts marked with #selenium hashtag on www.webelement.click site
2	Download and set up Java SDK
3	Download and set up Maven
4	Download and set up Intellij Idea
5	Download appropriate web driver
6	Create maven project
7	Add selenium library to your dependencies
8	Write HelloWorld program that opens some web page and perform couple of interactions
9	Step by step increase the complexity of your code
10	Add JUnit or TestNg to your code

Увеличьте ширину центральной колонки так чтобы она составляла примерно 2/3 от общей ширины. Выберите всю центральную колонку, кликните правой кнопкой мыши и выберите Format Cels... В открывшемся диалоге, перейдите на вкладку Alignment, установите чекбокс напротив Wrap text automatically и нажмите [Ok].

Поработаем немного над стилизацией. Дело это весьма субъективное, и в вашей системе не обязательно будут установлены те шрифты, которые использую я, поэтому тут каждый должен руководствоваться в первую очередь своим вкусом. Выделите жирным текст в заголовке таблицы, а также в столбце с номерами шагов (выделить и нажать Ctrl+B). Выделите ячейки с описанием шагов, и выберите отличающийся шрифт, так чтобы визуально было удобно отделять элементы чеклиста. Наконец, переименуйте вкладку на которой мы расположили наш чеклист во что-то более осмысленное. Я назвал свою вкладку FrontEnd. Добавьте еще одну вкладку и назовите ее BackEnd. Должно получиться что-то подобное:

libre office checklist step 1

Добавляем дроп-дауны со статусами

Переходим на вкладку BackEnd. Берём, данные из врезки ниже, и вставляем куда-нибудь на этой вкладке. Ячейку со словом Statuses можно выделить отдельным цветом. Наш чеклист не будет ее использовать. Она нужна только для более ясного понимания смысла данных, которые мы описываем.

Statuses
PASSED
FAILED
SKIPPED

Возвращаемся на вкладку FrontEnd. Выбираем все ячейки чеклиста в колонке Step result (кроме, конечно же, заголовка колонки). В верхнем меню выбираем Data ⇒ Vality…​. В появившемся диалоге на вкладке Criteria в списке Allow выбираем значение Cell range. Нажимаем на кнопку выбора области ячеек напротив поля Source, переходим на вкладку BackEnd, выделяем три наших статуса (не затрагивая выделением заголовок) и подтверждаем выделение кнопкой в диалоге выбора области, который к этому моменту все ещё должен висеть где-то у вас на экране.

Нас переносит обратно в основной диалог настройки Validity. Там мы жмем [Ok], и видим, что теперь при выборе ячейки в колонке Step Result рядом появляется маленькая стрелочка "вниз", нажав на которую мы открываем список доступных вариантов.

libre office checklist step 2

Добавляем окраску

На этом шаге мы добавим автоматическое окрашивание шага в зависимости от выбранного в выпадающем списке "Step result" варианта. Такого рода окрашивание реализуется при помощи условного форматирования (т.е. присваивания элементу стиля по некоторому условию).

Выделим всю область наших шагов (включая номер шага и результат шага) за исключением заголовка таблицы и нажмем кнопку, вызывающую диалог условного форматирования. Вы должны увидеть что-то похожее на то, что показано на скриншоте ниже.

libre office checklist step 3

Что важного мы видим здесь? Первое - это область наложения условного форматирования. Она указана в поле Range. Если мы добавим какие-то шаги или колонки, то и область нужно будет изменить. Второе - сами условия. На скриншоте видно одно условие. Оно появилось там по умолчанию и мы не будем его использовать. Вместо этого мы будем использовать три других. А пока мы не начали, небольшое, но важное отступление.

Вы наверняка замечали, что в формулах при ссылках на ячейки иногда используются символы $. Что они означают? Дело в том, что для удобства пользователя формула, установленная в одной ячейке, может быть перенесена (размножена) на другие ячейки перетаскиванием выделения "за уголок". При этом для новых ячеек, на которые формула расширится, ссылки в формуле будут соответственным образом изменены. Например, у нас есть колонки A, B и C. В колонках A и B у нас находятся какие-то числа, а в колонке C мы хотим посчитать сумму A+B. Мы выбираем ячейку первой строки колонки C (C1) и пишем там =A1+B1. Таким образом, получая результат сложения значений в колонках в первой строке. Далее мы "зацепляем" ячейку C1 за уголок и растягиваем ее вниз до последней строки, хранящей наши числа. При этом LibreOffice автоматически изменяет ссылки в формуле для каждой следующей строки. Например, для второй строки формула изменится на =A2+B2, для третей на =A3+B3, и.т.д.

То же касается и горизонтального "расширения" формулы. При таком расширении каждая следующая ячейка получает ссылку на колонку идущей следом за предыдущей. Но что если мы хотим зафиксировать одну из осей (или даже обе сразу) и запретить формуле сдвигать какую-либо ссылку на ячейку при расширении самой формулы в каком-либо направлении? Для этого и используется знак $.

В нашем примере мы можем захотеть чтобы в строках колонки С была бы сумма не значений колонок A и B соответствующей строки, а сумма из первой строки колонки A и соответствующей строки колонки B. В таком случае, в C1 мы пишем: =A$1+B1. В этой формуле мы зафиксировали первое слагаемое в первой строке колонки A (колонка, при этом, осталась незафиксированной и будет меняться при растягивании формулы вправо или влево). Теперь LibreOffice будет автоматически изменять ссылки в формуле для каждой следующей строки следующим образом: для второй строки формула изменится на =A1+B2, для третей на =A1+B3, и.т.д.

Отлично, идём дальше!

Итак, мы собираемся задать условия которые будут определять цвет для каждой ячейки в нашем выделении. В диалоге изменим тип условия для первой записи с Cell value is на Formula is. В поле формулы я ставлю следующее значение (далее я объясню что в ней что означает): $D4=BackEnd.$B$4. И так: $D4 - это первая ячейка в графе Step result с "зафиксированной" колонкой; BackEnd - это название вкладки, где мы храним вспомогательные данные, чтобы они не мозолили нам глаза; $B$4 - это координата ячейки (фиксированная по всем осям), которая хранит статус PASSED. В вашем варианте координаты могут быть иными.

Отметим еще раз, что на нашей основной вкладке в нашей формуле мы зафиксировали колонку D, но не зафиксировали номер строки, а также жестко зафиксировали ячейку B4 по всем направлениям на вкладке с данными.

Дело в том, что применяя формулу в условном форматировании к области мы как бы применяем ее сначала к верхней левой ячейке области, а затем растягиваем эту формулу вправо и вниз до нижней правой ячейки. Соответственно, для каждой следующей ячейки "правее" формула будет преобразована таким образом, что координаты по горизонтали (буквы) будут смещены на позицию правее. Поэтому если бы я не зафиксировал "горизонталь" для колонки D, то, вычисляя стиль для ячейки C4 (т.е. на одну позицию правее левой верхней ячейки нашего выделения) условие бы вычислялось на основании значения в колонке E4, где статуса уже нет. Заблокировав горизонтальное направление знаком $ мы решили эту проблему. Вертикальное направление мы не блокировали, потому что ячейки ниже верхней левой, должны брать статус шага из своего ряда.

Ячейку BackEnd.$B$4 мы заблокировали по всем осям потому что вне зависимости от того для какой ячейки нашего выделения мы вычисляем стиль, статус в данном случае мы берем из строго определенного места которое не должно меняться.

Осталось выбрать стиль, который мы хотим применить для всех ячеек, соответствующих установленному нами правилу. Из выпадающего списка выбираем предустановленный стиль Good. Теперь мы можем сохранить изменения, закрыть диалог и убедиться, что все шаги, в которых мы установили Step result в значение PASSED, окрашиваются в зеленый цвет. Правда, если поменять значение на какое-то другое, расцветка пропадает. Сейчас мы это будем исправлять.

Т.к. мы создали и сохранили правило условного форматирования, мы можем вернуться к нему через ту же кнопку, которую использовали для создания, только на этот раз в выпадающем меню выбираем опцию "Manage". Выделяем правило, которое мы создали и жмем Edit…​. Там жмем кнопку Add добавляя в наше составное правило новое условие. Повторяем действия, совершенные нами для первого условия, за той лишь разницей, что в данном случае вместо BackEnd.$B$4 в нашей формуле, мы указываем координаты, где хранится статус FAILED. В моем случае формула для второго условия будет такая: $D4=BackEnd.$B$5. Присваиваем этому условию стиль Bad и повторяем всё то же самое для оставшегося статуса SKIPPED. Для него хорошо подойдет стиль Neutral.

Готово! Осталось добавить график, и чеклист можно смело использовать.

Добавляем график

Добавление графика будет состоять из трёх шагов: первый шаг - подготовка данных для графика, второй шаг - подготовка цветов, которыми график будет раскрашен (да, в LibreOffice это не самая тривиальная вещь, либо я просто не знаю как сделать это проще), и третий шаг - создание графика поверх подготовленных данных.

Подготовка данных для графика. График будет отображать долю шагов, завершенных с определенным статусом, соответственно, количество шагов в каждом статусе надо как-то посчитать. Переходим на вкладку BackEnd. Там, в ячейке справа (непосредственное соседство статусов и подсчитанного количества шагов, связанных с ними, весьма важно) от статуса PASSED я пишу следующую формулу: =COUNTIF(FrontEnd.$D$4:FrontEnd.$D$13, $B4). Вы пишете такую же формулу, но исправляете координаты ячеек если требуется. Функция COUNTIF считает количество элементов (ячеек) в указанной области, значение которых удовлетворяет указанному условию. В нашем примере, область, в которой мы считаем ячейки: FrontEnd.$D$4:FrontEnd.$D$13, т.е. это ячейки из колонки Step result. Эту область мы жестко зафиксировали, для того чтобы затем корректно распространить расчеты на оставшиеся статусы. Обратите внимание на то, что теперь мы ссылаемся на вкладку FrontEnd, потому что "родная" вкладка для нас сейчас другая. Условие, которым должны удовлетворять ячейки, которые мы хотим посчитать, указаны у нас как $B4. Это координата, где на вкладке BackEnd (на которой мы сейчас находимся) у меня хранится статус PASSED. Растягиваем формулу еще на две ячейки вниз, покрывая таким образом статусы FAILED и SKIPPED. Можно убедиться, что результат подсчета изменяется в соответствие с изменениями результатов шага на вкладке FrontEnd.

Добавление цветов, для раскраски графика. Вообще, этот шаг не очень важен. Если мы его не совершим, график выберет цвета, которыми будет раскрашивать разные области, автоматически. Я бы хотел, чтобы цвета максимально соответствовали бы раскраске самих шагов (хотя в моем примере точно мы их не воспроизведем), поэтому покажу вам как это принципиально делается.

Вообще, есть два способа раскрасить график. Первый способ более интерактивен, но и более бажен. Он заключается в том, что мы сперва олпределяем коды цветов и сохраняем их в отдельных ячейках, а затем при создании графика указываем эту область в специальном поле диалога. Этот способ более интерактивен, потому что цвтеами мы можем динамически управлять, менять их по условиям и т.д. Но этот способ имеет один серьёзеый недостаток. В LibreOffice есть баг, из-за которго легенда графика не отражает выбранных вами цветов, поэтому сопоставлять элементы графика с описанием в легенде не очень удобно, да и может привести к неверной интерпретации данных.

Второй способ менее интерактивне, но лишен вышщеуказанной проблемы. В этом способе мы сначала создаем график с расцветкой по умолчанию, а затем исправляем цвета в диалоге стилизации графика уже после того как он создан. Так как задачи интерактивного выбора цветов для графика перед нами не стоит, мы пойдем вторым путём.

Размещаем график. Переходим на вкладку FrontEnd и кликаем на кнопку добавления графика. В появившемся визарде, выбираем тип графика Pie Chart, затем выбираем стиль графика там же (либо оставляем выбор по умолчанию). Переходим на следующий шаг визарда. Там в поле выбора области построения графика указываем область из нашей вкладки BackEnd, включающую как статусы, так и размещенный рядом подсчёт количества соответствующих ячеек. Область должна быть две клетки в ширину и три в высоту. В моём случае, эта область определяется так: BackEnd.$B$4:$C$6. На этом же экране, выбираем "Data series in columns" и убеждаемся, что у нас стоит отметка только в одном чекбоксе, а именно "First column as label". Жмём кнопку Finish, ресайзим график так чтобы он помещался на экран вместе с другой информацией, и размещаем его в удобном месте.

Далее кликаем на график правой кнопкой мыши и выбираем Edit. Теперь мы в режиме редактирования. Кликаем левой кнопкой на область графика,а затем еще раз, но уже на один из конкретных секторов. Затем снова правой кнопкой на сектор и выбираем Format data point. Появляется диалог стилизации, где на вкладке Area можно выбрать цвет для сектора. Выбирать цвета можно либо из одной из предустановленых палитр, доступных там же в выпадающем списке, либо подобрать цвет самостоятельно, комбинируя интенсивности цветовых каналов (кнопка Pick) в разных форматах, либо просто ввести шестнадцатеричный код, если он у вас уже откуда-то имеется. После того, как цвет для сектора установлен, необходимо повторить процедуру для остальных секторов.

Вот и всё! Результат должен выглядеть так (тут я показываю обе вкладки чтобы у вас была возможность сопоставить координаты, которые я использовал в формулах с тем как у меня размещены данные фактически):

libre office checklist final result frontend
libre office checklist final result backend

Остались вопросы? Задавайте их тут. Я постараюсь дополнить статью опираясь на ваши замечания.