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语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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实例
2013/12/24 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
JS实现图片预加载无需等待
2012/12/21 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
Javascript继承机制详解
2017/05/30 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
JAVA代码查错题
2014/10/10 面试题
实习单位推荐信范文
2013/11/27 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
小学六一主持词开场白
2015/05/28 职场文书
python本地文件服务器实例教程
2021/05/02 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技