Изучение Excelize с помощью Go

Формулы, сводные таблицы и плагины предоставляют способы преобразования или управления вашими данными, если они находятся в формате CSV или XLSX. Но что, если вы заинтересованы в постоянной загрузке данных в общий отчет, который другим членам команды будет проще использовать в Excel или Google Таблицах?

Excelize – это библиотека Go для создания таблиц, совместимых с Excel, с поддержкой встраивания формул, стилей, диаграмм и т. Д. Недавно я работал над проектом автоматизации, в котором я использовал Go и Excelize для каталогизации структуры каталогов и превращения этой информации в автоматически обновляемую электронную таблицу.

Использование Go для такого легкого типа «ETL-подобной» рабочей нагрузки было захватывающим опытом, и я хотел поделиться некоторыми идеями, которые я получил во время работы с Excelize.

Определение стиля

Неудивительно, что в Excel есть система стилей, встроенная в электронную таблицу, когда вы меняете атрибуты фона, текста или границы ячейки. Мне потребовалось немного больше времени, чем я хотел бы признать, чтобы понять, как Excelize обрабатывает стили. В частности, многие примеры документации предоставляют объект стиля в виде строки JSON.

Это не то, как вы хотели бы структурировать свои стили, поскольку вы теряете все проверки типов и должны обрабатывать escape-символы и форматирование JSON вручную. Оказывается, NewStyle функция поддерживает interface{} параметр, и когда вы отодвигаете крышки, эта функция просто демаршалирует вашу строку в Style объект.

Если мы сделаем еще один шаг вперед в приведенном выше примере, вы можете определить Style структуру inline. Теперь вам не нужно беспокоиться о написании JSON вручную или о том, чтобы испортить типы отдельных атрибутов.

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

Оказывается, как и в CSS, ожидается определение четырех структур Border для четырех сторон ячейки (сверху, слева, справа, снизу). В примере слева вы заметите, что вы назначаете каждую сторону, устанавливая Type атрибут.

Использование среза карты для этой структуры данных кажется интересным, но может иметь некоторые скрытые преимущества. Если у вас есть какие-либо мысли по этому поводу, я хотел бы услышать об этом в комментариях.

Индексирование стилей

Excelize создает индекс стилей, которые встраиваются в электронную таблицу; к сожалению, он предоставляет этот индекс только через инкрементный идентификатор. Я предполагаю, что именно так Excel обрабатывает эту информацию внутри, но я обнаружил, что это немного подвержено ошибкам, поскольку я добавил больше стилей. Я решил создать централизованный указатель этих стилей, зарегистрировав их заранее, а затем использовал, map[string]int чтобы прикрепить имя к внутреннему идентификатору стиля.

Это позволяет мне вводить индекс стиля в различные функции и получать стиль по его имени. Я также написал методы оболочки для StyleIndex структуры, чтобы обеспечить лучшее автозаполнение и абстрагироваться от базового ключа, если мне нужно будет изменить его в будущем.

Конфигурация ячейки

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

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

  • Если каждый вызов функции указывает свой собственный идентификатор стиля, это делает ее более универсальной и многоразовой.
  • Определение отдельной функции для каждого стиля означает, что конечному пользователю не нужно иметь столько знаний об используемых стилях.

Есть ли у вас какие-нибудь мысли по поводу этого компромисса? Возможно, вы столкнулись с этой проблемой в другой системе стилей.

Создание смещений ячеек и строк при итерации данных

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

Заключение

Мне понравилось использовать Excelize для автоматизации создания электронных таблиц со встроенным богатым содержанием. Это очень похоже на API нижнего уровня поверх формата файла Excel, а это означает, что вам придется потратить некоторое время на создание функций более высокого уровня для себя. Вы использовали Excelize раньше или, возможно, другую библиотеку Excel на другом языке?

Ответить