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 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
解决Go gorm踩过的坑
Apr 30 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 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实现微信扫码自动登陆与注册功能
2016/09/22 PHP
PHP使用函数用法详解
2018/09/30 PHP
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
类如何去实现接口
2013/12/19 面试题
财务部出纳岗位职责
2013/12/22 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
酒店员工培训方案
2014/06/02 职场文书
市场营销策划方案
2014/06/11 职场文书
2015年教师节慰问信
2015/03/23 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript
Python+tkinter实现高清图片保存
2022/03/13 Python
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫