Работа с 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)
// Доба