Golang генерирует документ Excel

задняя часть Go
Golang генерирует документ Excel

Это 7-й день моего участия в Gengwen Challenge.Подробности о мероприятии:Обновить вызов

Создание документов Excel на основе данных является очень распространенным требованием. В этой статье рассказывается, как использовать GoExcelizeБиблиотека для создания документов Excel, а также реализация кода в некоторых конкретных сценариях.

О библиотеке Excelize

ExcelizeЭто базовая библиотека для работы с документами Office Excel, написанными на языке Go и основанная на международном стандарте ECMA-376, ISO/IEC 29500. Его можно использовать для чтения и записи электронных таблиц, созданных с помощью Microsoft Excel™ 2007 и более поздних версий. Поддерживает несколько форматов документов, таких как XLSX / XLSM / XLTM / XLTX, обладает высокой совместимостью с документами со сложными компонентами, такими как стили, изображения (таблицы), сводные таблицы, слайсеры и т. д., и предоставляет API-интерфейсы потокового чтения и записи для обработки больших объемов данных. масштаб книги данных. Его можно применять к различным платформам отчетности, облачным вычислениям, граничным вычислениям и другим системам. Для использования этой библиотеки требуется язык Go версии 1.15 или выше.

Сравнение производительности

На следующем рисунке показано сравнение производительности некоторых основных библиотек Excel с открытым исходным кодом при создании простых текстовых матриц 12800*50 (ОС: macOS Mojave версии 10.14.4, ЦП: Intel Core i5 3,4 ГГц, ОЗУ: 16 ГБ 2400 МГц DDR4, жесткий диск: 1 ТБ), включая Go, Python, Java, PHP и NodeJS.

Установить

Последняя версияv2.4.0:

go get github.com/360EntSecGroup-Skylar/excelize/v2

Создать документ Excel

В следующем примере мы создаем документ Excel и используемNewSheetметод создает новыйSheet2рабочий лист,Sheet1рабочий лист, созданный по умолчанию, тогда мы используемSetCellValueметоды находятся вSheet2рабочий листA2клетки иSheet1табличныйB2ячейку, чтобы установить значение, и с помощьюSetActiveSheetнастройки методаSheet2Рабочий лист является рабочим листом по умолчанию, который, наконец, называетсяSaveAsМетод записывает данные в документ Excel:

package main

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    // 创建一个工作表
    index := f.NewSheet("Sheet2")
    // 设置单元格的值
    f.SetCellValue("Sheet2", "A2", "Hello world.")
    f.SetCellValue("Sheet1", "B2", 100)
    // 设置工作簿的默认工作表
    f.SetActiveSheet(index)
    // 根据指定路径保存文件
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

Реальное воспроизведение сцены

Создать рабочий лист

Имена листов чувствительны к регистру:

index := f.NewSheet("Sheet2")

Удалить созданный по умолчанию рабочий лист

Документ Excel, созданный по умолчанию, содержит файл с именемSheet1Рабочий лист, нам может не понадобиться этот рабочий лист по умолчанию, в настоящее время мы можем удалить этот рабочий лист:

f.DeleteSheet("Sheet1")

Объединить ячейки

сливатьсяSheet1рабочий листF1:I2Ячейки в диапазоне:

excel.MergeCell("Sheet1", "F1", "I2")

сотовый стиль

Часто встречается при настройке стилей для ячеек, например при установке цвета фона ячеек,ExcelizeБиблиотека предоставляет следующие два метода для установки стилей ячеек (NewStyleиSetCellStyle):

// 通过给定的样式格式 JSON 或结构体的指针创建样式并返回样式索引。
// 请注意,颜色需要使用 RGB 色域代码表示。
style, err := f.NewStyle(`{
    "border": [
    {
        "type": "left",
        "color": "0000FF",
        "style": 3
    },
    {
        "type": "top",
        "color": "00FF00",
        "style": 4
    },
    {
        "type": "bottom",
        "color": "FFFF00",
        "style": 5
    },
    {
        "type": "right",
        "color": "FF0000",
        "style": 6
    },
    {
        "type": "diagonalDown",
        "color": "A020F0",
        "style": 7
    },
    {
        "type": "diagonalUp",
        "color": "A020F0",
        "style": 8
    }]
}`)
if err != nil {
    fmt.Println(err)
}
err = f.SetCellStyle("Sheet1", "D7", "D7", style)

текст горизонтально по центру

Необходимо использовать горизонтальное центрирование текста.Alignmentструктура стиля:

type Alignment struct {
    Horizontal      string `json:"horizontal"`
    Indent          int    `json:"indent"`
    JustifyLastLine bool   `json:"justify_last_line"`
    ReadingOrder    uint64 `json:"reading_order"`
    RelativeIndent  int    `json:"relative_indent"`
    ShrinkToFit     bool   `json:"shrink_to_fit"`
    TextRotation    int    `json:"text_rotation"`
    Vertical        string `json:"vertical"`
    WrapText        bool   `json:"wrap_text"`
}

Центрировать по горизонтали, пока установленоHorizontalзначениеcenterПросто:

style, err := f.NewStyle(`{"alignment":{"horizontal":"center"}}`)
if err != nil {
    fmt.Println(err)
}
err = excel.SetCellStyle("Sheet1", "B1", "B1", style)

Установить заливку сплошным цветом для ячейки

Заполнение ячеек цветом будет использоватьFillструктура стиля:

type Fill struct {
    Type    string   `json:"type"`
    Pattern int      `json:"pattern"`
    Color   []string `json:"color"`
    Shading int      `json:"shading"`
}

Структура стиля

Из кода, который устанавливает стили выше, мы можем найти, чтоborderэто массив, иalignmentпредставляет собой структуру, состоящую изStyleСтруктура определяет:

type Style struct {
    Border        []Border    `json:"border"`
    Fill          Fill        `json:"fill"`
    Font          *Font       `json:"font"`
    Alignment     *Alignment  `json:"alignment"`
    Protection    *Protection `json:"protection"`
    NumFmt        int         `json:"number_format"`
    DecimalPlaces int         `json:"decimal_places"`
    CustomNumFmt  *string     `json:"custom_number_format"`
    Lang          string      `json:"lang"`
    NegRed        bool        `json:"negred"`
}

Справочная документация