Работа с Excel в Go (Golang): библиотеки, примеры и инструменты

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с Excel в Go (Golang): обзор библиотек и практические примеры

Go (Golang) — это современный компилируемый язык программирования, который всё чаще используется для создания серверных приложений, обработки данных и автоматизации офисных задач. Одной из частых потребностей является работа с электронными таблицами Excel. В этой статье мы рассмотрим основные библиотеки для работы с Excel в Go, их возможности и приведём практические примеры кода.

Основные библиотеки для работы с Excel в Go

На данный момент наиболее популярными и функциональными являются две библиотеки:

  • excelize (github.com/qax-os/excelize) — мощная библиотека для чтения и записи файлов Excel (форматы .xlsx). Поддерживает стили, формулы, графики, объединение ячеек, защиту листов и многое другое.
  • tealeg/xlsx (github.com/tealeg/xlsx) — более лёгкая библиотека для базовых операций чтения и записи .xlsx файлов. Проста в освоении, но имеет меньше возможностей.

В этом руководстве мы сосредоточимся на библиотеке excelize, так как она является де-факто стандартом для работы с Excel в Go.

Установка библиотеки excelize

Для начала установите библиотеку с помощью менеджера пакетов Go:

go get github.com/qax-os/excelize/v2

После установки можно импортировать её в проект:

import "github.com/qax-os/excelize/v2"

Создание нового Excel файла

Создадим простой файл с данными о продажах:

package main

import (
    "fmt"
    "github.com/qax-os/excelize/v2"
)

func main() {
    // Создаём новый файл
    f := excelize.NewFile()
    defer f.Close()

    // Создаём новый лист
    index := f.NewSheet("Продажи")
    
    // Устанавливаем значения ячеек
    f.SetCellValue("Продажи", "A1", "Товар")
    f.SetCellValue("Продажи", "B1", "Количество")
    f.SetCellValue("Продажи", "C1", "Цена")
    
    f.SetCellValue("Продажи", "A2", "Ноутбук")
    f.SetCellValue("Продажи", "B2", 15)
    f.SetCellValue("Продажи", "C2", 85000)
    
    f.SetCellValue("Продажи", "A3", "Монитор")
    f.SetCellValue("Продажи", "B3", 30)
    f.SetCellValue("Продажи", "C3", 32000)

    // Устанавливаем активный лист
    f.SetActiveSheet(index)

    // Сохраняем файл
    if err := f.SaveAs("sales.xlsx"); err != nil {
        fmt.Println(err)
    }
    
    fmt.Println("Файл успешно создан!")
}

Чтение существующего Excel файла

Теперь прочитаем созданный ранее файл и выведем данные в консоль:

package main

import (
    "fmt"
    "github.com/qax-os/excelize/v2"
)

func main() {
    f, err := excelize.OpenFile("sales.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()

    // Получаем все строки из листа "Продажи"
    rows, err := f.GetRows("Продажи")
    if err != nil {
        fmt.Println(err)
        return
    }

    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

Форматирование ячеек и стили

Одна из сильных сторон excelize — поддержка стилей. Вот пример, как сделать заголовки жирными и добавить границы:

package main

import (
    "fmt"
    "github.com/qax-os/excelize/v2"
)

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

    // Создаём стиль для заголовков
    style, err := f.NewStyle(&excelize.Style{
        Font: &excelize.Font{
            Bold: true,
            Size: 12,
        },
        Border: []excelize.Border{
            {Type: "left", Color: "000000", Style: 1},
            {Type: "right", Color: "000000", Style: 1},
            {Type: "top", Color: "000000", Style: 1},
            {Type: "bottom", Color: "000000", Style: 1},
        },
        Fill: excelize.Fill{
            Type:    "pattern",
            Pattern: 1,
            Color:   []string{"#D9E1F2"},
        },
    })
    if err != nil {
        fmt.Println(err)
        return
    }

    // Применяем стиль к ячейкам
    f.SetCellValue("Sheet1", "A1", "Имя")
    f.SetCellValue("Sheet1", "B1", "Возраст")
    f.SetCellValue("Sheet1", "C1", "Город")
    
    f.SetCellStyle("Sheet1", "A1", "C1", style)

    // Доба                    

Рекомендаций