Изучение 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 на другом языке?