Golang生成Excel文档的方法步骤


Posted in Golang onJune 09, 2021

基于数据生成 Excel 文档是一个很常见的需求,本文将介绍如何使用 Go 的 Excelize 库去生成 Excel 文档,以及一些具体场景下的代码实现。

关于 Excelize 库

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.15 或更高版本。

性能对比

下图是一些主要的开源 Excel 库在生成 12800*50 纯文本矩阵时的性能对比(OS: macOS Mojave version 10.14.4, CPU: 3.4 GHz Intel Core i5, RAM: 16 GB 2400 MHz DDR4, HDD: 1 TB),包括 Go、Python、Java、PHP 和 NodeJS。

Golang生成Excel文档的方法步骤

安装

最新的版本是 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"`
}

Style 结构体

从上面设置样式的代码中,我们可以发现 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"`
}

参考文档

Excelize docs reference
Talks at Beijing Gopher Meetup

到此这篇关于Golang生成Excel文档的方法步骤的文章就介绍到这了,更多相关Golang生成Excel内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
用golang如何替换某个文件中的字符串
Apr 25 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
go xorm框架的使用
May 22 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang bufio详细讲解
Apr 21 Golang
深入理解 Golang 的字符串
May 04 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go timer如何调度
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 #Golang
Golang中异常处理机制详解
Go语言实现Snowflake雪花算法
Jun 08 #Golang
go语言中http超时引发的事故解决
Jun 02 #Golang
Golang二维数组的使用方式
May 28 #Golang
Golang标准库syscall详解(什么是系统调用)
May 25 #Golang
You might like
php 魔术函数使用说明
2010/02/21 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
js模拟实现Array的sort方法
2007/12/11 Javascript
JS 字符串连接[性能比较]
2009/05/10 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
Python FTP操作类代码分享
2014/05/13 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
详解Python中的分支和循环结构
2020/02/11 Python
Django在Model保存前记录日志实例
2020/05/14 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
小学二年级评语
2014/04/21 职场文书
十八大标语口号
2014/10/09 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS