Работа с Excel в Go (Golang)
Go (Golang) — это компилируемый язык программирования, который отлично подходит для создания высокопроизводительных серверных приложений, обработки данных и автоматизации. Если вам нужно генерировать отчёты, импортировать или экспортировать данные в формате Excel, Go предлагает несколько зрелых библиотек. В этой статье мы рассмотрим две самые популярные: exelize и tealeg/xlsx.
Почему Go для работы с Excel?
- Скорость — Go компилируется в машинный код, что делает обработку больших Excel-файлов очень быстрой.
- Простота — минималистичный синтаксис и встроенная поддержка конкурентности (goroutines) упрощают параллельную обработку листов.
- Кроссплатформенность — скомпилированный бинарник работает на Windows, Linux и macOS без зависимостей.
- Надёжность — строгая типизация и отсутствие исключений снижают риск ошибок при работе с данными.
Библиотека exelize
exelize (github.com/xuri/exelize) — самая популярная и активно поддерживаемая библиотека для работы с XLSX в Go. Она позволяет создавать, читать и редактировать файлы Excel с поддержкой стилей, формул, объединённых ячеек, диаграмм и изображений.
Установка
go get github.com/xuri/exelize/v2
Пример: создание простого Excel-файла
package main
import (
"fmt"
"github.com/xuri/exelize/v2"
)
func main() {
f := exelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// Создаём новый лист
index := f.NewSheet("Sheet2")
// Устанавливаем значение ячейки
f.SetCellValue("Sheet2", "A2", "Привет, Go!")
f.SetCellValue("Sheet1", "B2", 100)
// Устанавливаем активный лист
f.SetActiveSheet(index)
// Сохраняем файл
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
Пример: чтение данных из Excel
package main
import (
"fmt"
"github.com/xuri/exelize/v2"
)
func main() {
f, err := exelize.OpenFile("Book1.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
// Получаем значение ячейки
cell, err := f.GetCellValue("Sheet1", "B2")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Значение B2:", cell)
// Получаем все строки из листа
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
for _, row := range rows {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
}
Библиотека tealeg/xlsx
tealeg/xlsx (github.com/tealeg/xlsx) — более старая, но всё ещё популярная библиотека. Она проще в использовании для базовых операций, хотя не поддерживает все возможности exelize (диаграммы, изображения). Отлично подходит для быстрой генерации простых отчётов.
Установка
go get github.com/tealeg/xlsx/v3
Пример: создание файла
package main
import (
"github.com/tealeg/xlsx/v3"
)
func main() {
wb := xlsx.NewFile()
sheet, _ := wb.AddSheet("Лист1")
// Добавляем строку
row := sheet.AddRow()
row.AddCell().SetString("Имя")
row.AddCell().SetString("Возраст")
row2 := sheet.AddRow()
row2.AddCell().SetString("Анна")
row2.AddCell().SetInt(28)
wb.Save("people.xlsx")
}
Пример: чтение файла
package main
import (
"fmt"
"github.com/tealeg/xlsx/v3"
)
func main() {
wb, err := xlsx.OpenFile("people.xlsx")
if err != nil {
panic(err)
}
sheet := wb.Sheets[0]
sheet.ForEachRow(func(r *xlsx.Row) error {
r.ForEachCell(func(c *xlsx.Cell) error {
fmt.Printf("%s\t", c.Value)
return nil
})
fmt.Println()
return nil
})
}
Сравнение библиотек
- exelize — активно развивается, поддерживает стили, формулы, диаграммы, изображения, условное фор