Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 2 из 25 ~18 мин +20 XP

Установка excelize и первый файл

Установка excelize — это go mod init, один go get и двенадцать строк кода до первого report.xlsx на диске. В этом уроке соберём модуль, разберём excelize пример с NewFile, SetCellValue и SaveAs, заглянем внутрь созданного файла и пройдёмся по типичным ошибкам установки — от старого пути импорта до несовпадения версий Go.

Содержание урока · 10 разделов

Точка старта: пустая папка, установленный Go и желание к концу урока получить настоящий xlsx-файл, который открывается двойным кликом. Из прошлого урока вы знаете, что xlsx — это zip с XML, и что вся работа идёт через дескриптор *File; теперь это превращается из карты в инструмент. Путь к первой программе короткий: инициализировать модуль, добавить зависимость, написать main.go с четырьмя вызовами. Ловушка, на которой спотыкаются все, кто пришёл по старым статьям: путь импорта excelize менялся. В сети до сих пор гуляют примеры с github.com/360EntSecGroup-Skylar/excelize — это та же библиотека до переименования организации: с версии 2.4.0 проект живёт по адресу github.com/xuri/excelize/v2, и только этот путь встречается в современном коде. Скопируете старый импорт — компилятор не найдёт пакет, и вы потратите полчаса на поиск несуществующей проблемы. В этом уроке поставим правильную версию и сразу проверим результат на прочность.

Установка excelize: go mod init и go get#

Установка excelize укладывается в две команды терминала, как любая библиотека Go. Если модуля в папке ещё нет, сначала go mod init с именем модуля — например example.com/report: без go.mod менеджер зависимостей не знает, куда записывать пакеты. Затем go get github.com/xuri/excelize/v2 — менеджер скачает последнюю стабильную версию и зафиксирует её в go.mod, а контрольные суммы появятся в go.sum. Читается путь импорта так: xuri — аккаунт автора на GitHub, excelize — репозиторий, /v2 — мажорная версия по правилам семантического версионирования Go: вторая версия библиотеки обязана жить за суффиксом, и без него компилятор не найдёт пакет. Имя пакета при этом осталось коротким — excelize: импортируете длинный путь, а в коде пишете excelize.NewFile, без алиасов. Требования к минимальной версии Go меняются между релизами, поэтому перед установкой гляньте раздел Requirements в README выбранного тега — это честнее, чем гадать по ошибкам компилятора.

Терминал: модуль и зависимость

GO
mkdir report && cd report

go mod init example.com/report

go get github.com/xuri/excelize/v2

Первая строка создаёт папку проекта, вторая — модуль с именем example.com/report: имя условное, для приватных утилит годится что угодно похожее на домен. go get скачивает библиотеку и записывает строку require github.com/xuri/excelize/v2 vX.Y.Z в go.mod; go.sum дополняется автоматически. Чистый Go без cgo означает, что никакие системные пакеты и компиляторы сверх самого Go не нужны.

Что проверить после установки#

  • В go.mod появилась строка require github.com/xuri/excelize/v2 с версией вида v2.9.x.
  • Рядом вырос go.sum с контрольными суммами — он обязателен для воспроизводимой сборки.
  • Импорт github.com/xuri/excelize/v2 компилируется без ошибок.
  • go build проходит на вашей версии Go — иначе смотрите Requirements релиза.

Первый файл: excelize пример на двенадцать строк#

Теперь excelize пример целиком — программа, которую вы будете писать в каждом скрипте курса с минимальными вариациями. Логика ровно из прошлого урока: NewFile создаёт книгу в памяти с листом Sheet1 по умолчанию, SetCellValue кладёт значения в ячейки, SaveAs сериализует книгу на диск, Close прибирает за дескриптором. Обратите внимание на обработку ошибки SaveAs: запись на диск может провалиться по массе причин — нет прав на папку, путь занят каталогом, диск переполнен, — и молча проглотить эту ошибку значит оставить пользователя с файлом, которого нет. В скриптах честным решением будет паника: утилита без результата бессмысленна, и упасть с понятным сообщением — быстрее, чем отработать впустую. В сервисах вместо panic вернут ошибку наверх с контекстом, но привычка проверять err у каждого вызова, который может провалиться, ставится именно здесь. Отдельное слово об именах файлов: если отчёт генерируется по расписанию, добавляйте в имя дату или период — report-2024-06.xlsx информативнее report.xlsx и никогда не затирает соседний, потому что SaveAs перезаписывает молча. Файл в текущей папке удобен для скрипта и плох для сервиса: там используйте путь из конфигурации и создавайте каталог заранее, потому что SaveAs не умеет mkdir и вернёт ошибку на отсутствующей папке.

main.go первого файла целиком

GO
package main

import (
    "fmt"

    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer f.Close()

    f.SetCellValue("Sheet1", "A1", "Отчёт за квартал")
    f.SetCellValue("Sheet1", "A2", 1250000)

    if err := f.SaveAs("report.xlsx"); err != nil {
        panic(err)
    }

    fmt.Println("report.xlsx создан")
}

Import с суффиксом /v2 обязателен: без него Go ищет первую мажорную версию, которой у excelize в общем доступе нет. NewFile возвращает дескриптор без ошибок — конструктор не может провалиться, потому что книга живёт в памяти. SetCellValue записывает строку и число, SaveAs пишет файл в текущую папку, и только после него defer f.Close() отработает при выходе из main. Запустите go run . — рядом появится report.xlsx.

Что получилось внутри report.xlsx#

Файл создан — теперь посмотрите на него глазами, для этого и писалась честная теория первого урока. Переименуйте report.xlsx в zip и распакуйте: увидите xl/workbook.xml со списком листов, где Book указывает единственный Sheet1, и xl/worksheets/sheet1.xml, где в строке с номером 1 лежат две ячейки — r=A1 со ссылкой на строку в общей таблице строк и r=A2 с числом 1250000 как есть, без кавычек. Это и есть главное следствие двоичного устройства формата, о котором мы говорили: текст уехал в xl/sharedStrings.xml, а числа хранятся числами — Excel будет считать с ними, как с числами, а не как с текстом, который притворяется числом. Откройте файл в LibreOffice, таблицах Google или самом Excel — всё выглядит ожидаемо, потому что excelize пишет корректный OOXML, а не файл, который Excel вылечит предупреждением. Такая проверка занимает минуту и экономит часы: дифф между ожидаемым и фактическим содержимым архива — самый быстрый способ понять, что именно вы записали. Пригодится и обратная привычка: присылайте распакованный файл, когда просите помощи у коллеги — вместо скриншота Excel-а он отвечает на вопрос «что реально лежит в ячейках» без вариантов толкования.

Типичные ошибки установки excelize#

Типичные ошибки при установке excelize сводятся к трём семьям. Первая — старый путь импорта: github.com/360EntSecGroup-Skylar/excelize из статей до 2021 года не резолвится, и никакой go mod tidy его не спасёт — меняйте на github.com/xuri/excelize/v2. Вторая — сеть: в закрытых контурах go get не может дотянуться до прокси по умолчанию, поэтому настройте GOPROXY на внутренний прокси-сервер или вендорьте зависимости через go mod vendor, чтобы сборка не ходила в интернет. Третья — версия Go: новые релизы excelize поднимают минимальную версию языка, и ошибка выглядит как загадочный ругательный листинг на свежий синтаксис внутри зависимостей — лечится либо обновлением Go, либо закреплением более старого тега библиотеки, который ваши версии поддерживают. Отдельно напомним про go mod tidy: он вычищает неиспользуемые зависимости и дописывает недостающие после ручных правок go.mod, поэтому в конце любой возни с зависимостями стоит прогнать его перед коммитом.

Минимальный набор вызовов первого файла#

ВызовЧто делаетВозвращает
excelize.NewFile()создаёт книгу в памяти с листом Sheet1*File без ошибок
f.SetCellValue(лист, ячейка, значение)кладёт значение в ячейку по A1-координатеошибку: нет листа или битая координата
f.SaveAs(имя)сериализует книгу и пишет файл на дискошибку записи: права, путь, диск
f.Close()освобождает ресурсы и временную папку дескриптораошибку закрытия, обычно игнорируют в скриптах

Куда двигаться дальше: структура курса#

Первый файл — это скелет, на который дальше наращиваются мышцы. Следующий урок про листы книги научит создавать вкладки с русскими названиями вместо Sheet1, переключать активный лист и удалять лишнее — без этого любой отчёт выглядит как черновик. Потом разберём запись ячеек всерьёз: у SetCellValue за внешней простотой скрываются правила типов, из-за которых теряются ведущие нули артикулов и точность длинных номеров. Стили — шрифты, заливки, границы — добавят файлу презентабельность, формулы посчитают итоги на стороне Excel, а потоковые режимы позволят выгружать миллионы строк без переполнения памяти. Финальная точка курса — итоговый проект: генератор отчёта продаж с вкладками, итогами и диаграммой, где каждый вызов из этого урока встретится вам снова. Никакой спешки: скелет должен дожить до конца курса без изменений, поэтому проверьте его ещё раз перед следующим уроком. Если хочется углубиться в механику модулей Go — версионирования, replace-директив, приватных репозиториев — вернитесь к материалам базового курса: подробный разбор пакетов и модулей есть в уроке про пакеты и модули продвинутого трека, а мы остаёмся в рамках одной зависимости и двигаемся дальше.

Проверка: путь импорта

Какой путь импорта excelize актуален для второй мажорной версии?

Проверка: go get

Что делает go get github.com/xuri/excelize/v2?

Что выведет программа?

Прочитайте код и выберите, что он выведет:

f := excelize.NewFile()

err := f.SaveAs("first.xlsx")

fmt.Println("err:", err)

Соберите первый файл

Допишите три вызова: создать книгу, записать значение и сохранить на диск.

f := excelize. f.("Sheet1", "A1", "Магазин") if err := f.("first.xlsx"); err != nil { panic(err) }

Соберите main.go по порядку

Расставьте строки в порядке выполнения программы: создание, запись, сохранение с проверкой ошибки, закрытие, вывод.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: установка и первый файл

Термин

go mod init

нажмите, чтобы перевернуть
Определение

Создаёт go.mod с именем модуля — точку входа для менеджера зависимостей. Без него go get некуда писать require-строку.

1 / 6

Модуль собран, report.xlsx лежит на диске и открывается без предупреждений — окружение курса готово, и дальше код будет наращиваться на этот скелет. В следующем уроке наведём порядок в книге: создадим листы с осмысленными именами через NewSheet, переключим активную вкладку и разберём удаление — листы книги целиком посвящены этому слою. После него — запись ячеек с типами данных, где у SetCellValue обнаружатся ловушки с ведущими нулями и точностью, а затем стили, форматы и формулы. Кросс-навигация для планирования: полный план с аннотациями лежит на странице курса, а пример готового файла к финалу — в описании итогового проекта. И напомним честно: песочница сайта не пишет файлы на диск, поэтому go run выполняйте локально — всё, что нужно, это Go из предыдущего раздела. Домашнее задание ниже закрепит команды установки до автоматизма.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.

Вывод

Запустите код, чтобы увидеть вывод.

Коротко: что запомнить

  • Установка excelize — это go mod init, затем go get github.com/xuri/excelize/v2.
  • Путь импорта обязан содержать /v2; старый 360EntSecGroup-Skylar из статей не работает.
  • Первый файл — четыре вызова: NewFile, SetCellValue, SaveAs с проверкой ошибки, Close с defer.
  • Данные живут в памяти до SaveAs; файл появляется только после него.
  • Внутри report.xlsx — те же XML-части, что в распакованном архиве: числа хранятся числами, текст — в sharedStrings.
  • Типичные ошибки установки: старый путь импорта, закрытая сеть без GOPROXY-зеркала, несоответствие версий Go.

Домашнее задание

Соберите модуль из урока с нуля в новой папке: go mod init с именем вашего проекта, go get github.com/xuri/excelize/v2, затем main.go с записью трёх ячеек — названия магазина, даты и суммы — и сохранением в первый.xlsx. Откройте файл в LibreOffice или таблицах Google и убедитесь, что все три значения на месте.

Личные заметкиПусто
Хранятся только в вашем браузере (Excelize · Установка excelize и первый файл)

Вопросы и ответы по уроку

Какая минимальная версия Go нужна для excelize?

Требования меняются между релизами библиотеки — свежие версии используют современный синтаксис и повышают порог. Перед установкой смотрите раздел Requirements в README нужного тега на GitHub; если обновить Go нельзя, закрепите более старый тег excelize, который ваша версия поддерживает.

go get падает с ошибкой сети в закрытом контуре. Что делать?

Настройте GOPROXY на внутренний прокси-сервер или вендорьте зависимости: go mod vendor скопирует пакеты в папку vendor, и сборка перестанет ходить в интернет. Оба варианта стандартны для контуров без доступа к proxy.golang.org.

Можно ли запускать код урока в песочнице сайта?

Нет: браузерный интерпретатор знает только fmt, strings, strconv, math, sort, errors и time и не пишет файлы на диск, а excelize требует диск и собственные пакеты. Код курса выполняйте локально — достаточно установленного Go, Excel и LibreOffice не обязательны.

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Следующая ступень учебного пути

Cron25 уроков~9 чпрактика25 уроков уже доступны

Фоновые задачи в Go: планировщик на robfig/cron

Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.

  • Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
  • Читать и писать cron-выражения: пять полей, спецсимволы, @daily
  • Управлять жизненным циклом: Start, Stop, Entry, Remove
  • Держать часовые пояса и секундные расписания под контролем