Содержание урока · 10 разделов
- Установка excelize: go mod init и go get
- Что проверить после установки
- Первый файл: excelize пример на двенадцать строк
- Что получилось внутри report.xlsx
- Типичные ошибки установки excelize
- Минимальный набор вызовов первого файла
- Куда двигаться дальше: структура курса
- Песочница урока
- Коротко: что запомнить
- Вопросы и ответы
Точка старта: пустая папка, установленный 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 выбранного тега — это честнее, чем гадать по ошибкам компилятора.
Терминал: модуль и зависимость
GOmkdir 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 первого файла целиком
GOpackage 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-а он отвечает на вопрос «что реально лежит в ячейках» без вариантов толкования.
Для разработки не нужен Microsoft Excel: report.xlsx открывается LibreOffice и таблицами Google без лицензий. Занимает минуту и ловит половину ошибок генерации — битые форматы, съехавшие заголовки, потерянные нули — раньше, чем их увидит заказчик. Напоминание о формате курса: браузерная песочница сайта не пишет файлы на диск, поэтому вся эта проверка работает только при локальном запуске — интерактивы урока тренируют API без неё.
Типичные ошибки установки 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, поэтому в конце любой возни с зависимостями стоит прогнать его перед коммитом.
github.com/xuri/excelize/v2 и github.com/xuri/excelize — разные пакеты для Go: суффикс мажорной версии обязателен по правилам семантического версионирования. Импорт без /v2 даст ошибку про отсутствие пакета, даже если go get выполнился успешно. Проверяйте первую строку пути, прежде чем искать проблему в коде.
Минимальный набор вызовов первого файла#
| Вызов | Что делает | Возвращает |
|---|---|---|
| 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)Соберите первый файл
Допишите три вызова: создать книгу, записать значение и сохранить на диск.
Соберите main.go по порядку
Расставьте строки в порядке выполнения программы: создание, запись, сохранение с проверкой ошибки, закрытие, вывод.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: установка и первый файл
Модуль собран, 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 и убедитесь, что все три значения на месте.
Личные заметкиПусто
Вопросы и ответы по уроку
Какая минимальная версия 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 не обязательны.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Фоновые задачи в Go: планировщик на robfig/cron
Курс по cron в Go: robfig/cron v3, синтаксис выражений, пояса, wrappers, конкурентность и graceful shutdown. 25 уроков с примерами и проектом.
- Собирать планировщик на robfig/cron v3 и запускать задачи по расписанию
- Читать и писать cron-выражения: пять полей, спецсимволы, @daily
- Управлять жизненным циклом: Start, Stop, Entry, Remove
- Держать часовые пояса и секундные расписания под контролем