前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go实现导出excel表格

go实现导出excel表格

原创
作者头像
liliane
发布2022-07-26 23:19:25
4.6K0
发布2022-07-26 23:19:25
举报
文章被收录于专栏:liliane随笔liliane随笔

一、概述

使用go实现导出excel表格代码比较固定,因此,可以抽取为工具函数,便于业务层复用。下面介绍简单一个封装函数,支持设置表头、数据内容,及简单样式。

二、实现步骤

1. 导入依赖包

代码语言:javascript
复制
import "github.com/xuri/excelize/v2"

这里选择主流的excel工具库。

2. 创建实例

函数签名:

代码语言:javascript
复制
func WriteToExcel(headers []string, data [][]interface{}, options ExcelOptions)

创建文件、工作表:

代码语言:javascript
复制
file := excelize.NewFile()
sheetIndex := file.NewSheet(sheetName)
file.SetActiveSheet(sheetIndex) // 默认sheet

SetActiveSheet 用来设置默认的工作表。

3. 设置表头

代码语言:javascript
复制
// 设置表头
for i, header := range headers {
   tempColAxis := firstColAxis + int32(i)
   writeCell(file, sheetName, tempColAxis, firstRowAxis, header)
}

设置单元格内容封装在子函数writeCell。

4. 填充数据

代码语言:javascript
复制
// 设置内容
for i, line := range data {
   tempRowAxis := firstRowAxis + i + 1
   for j, item := range line {
      tempColAxis := firstColAxis + int32(j)
      writeCell(file, sheetName, tempColAxis, tempRowAxis, item)
   }
}
// 设置单元格内容
func writeCell(file *excelize.File, sheetName string, collAxis int32, rowAxis int,
	value interface{}) {
	err := file.SetCellValue(sheetName, getCellIndex(collAxis, rowAxis), value)
	if err != nil {
		log.LogError("excel set cell value error:%v", err)
	}
}
// 获取单元格下标
func getCellIndex(colAxis int32, rowAxis int) string {
	return fmt.Sprintf("%c%d", colAxis, rowAxis)
}

SetCellValue:填写的单元格下标,先列下标,再行下标。例如,第一行第一列:A1,第二行第三列:C2。

5. 设置样式

代码语言:javascript
复制
// 设置样式
func setStyle(file *excelize.File, sheetName string, maxCol int32, options ExcelOptions) {
   err := file.SetColWidth(sheetName, string(firstColAxis), string(maxCol), options.ColWidth) // 设置列宽
   if err != nil {
      log.LogError("excel SetColWidth error:%v", err)
   }
   err = file.SetRowHeight(sheetName, firstRowAxis, options.RowHeight) // 设置行高
   if err != nil {
      log.LogError("excel SetRowHeight error:%v", err)
   }
   style := &excelize.Style{
      Font: &excelize.Font{
         Bold: true,
      },
   }
   styleId, err := file.NewStyle(style)
   if err != nil {
      log.LogError("excel NewStyle error:%v", err)
   }
   err = file.SetCellStyle(sheetName, getCellIndex(firstColAxis, firstRowAxis), getCellIndex(maxCol, maxRow),
      styleId)
   if err != nil {
      log.LogError("excel SetCellStyle error:%v", err)
   }
}

SetColWidth:设置列宽,需指定起止列。

SetRowHeight:设置行高,这里单设置表头的行高。

NewStyle:定义样式。

SetCellStyle:对指定区域,设置单元格样式。

6. 写到输出流

代码语言:javascript
复制
file.Write(httpWriter) 

此处设置到http输出流,写本地文件则可以输出到文件,比较不常用。

三、注意点

1. 通过http导出,需注意设置header。

代码语言:javascript
复制
Content-Disposition: fmt.Sprintf(`attachment; filename="%s"`, fileName)
Content-Type: application/vnd.ms-excel

2. 设置样式需注意,哪些样式可以作用于什么范围,样式不生效多数是因为给对象(如单元格)设置了不可设置到单元格的样式,例如行高。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、实现步骤
    • 1. 导入依赖包
      • 2. 创建实例
        • 3. 设置表头
          • 4. 填充数据
            • 5. 设置样式
              • 6. 写到输出流
              • 三、注意点
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档