Golang 创建 Excel 文件

经常会遇到需要导出数据报表的需求,除了可以通过 encoding/csv 导出 CSV 以外,还可以使用
https://github.com/qax-os/excelize 导出 xlsx 等格式的 excel,下面封装了一个方法,支持多 sheet 的 excel 数据生成,导出按需在接口实现层添加 f.SaveAs("xxx.xlsx") 即可

go 复制代码
package excel

import (
	"fmt"

	"github.com/xuri/excelize/v2"
)

type SheetData struct {
	SheetName string
	Headers   []string
	Rows      [][]interface{}
}

// GenerateExcelBySheets 生成 excel 表格
func GenerateExcelBySheets(sheets []SheetData) (*excelize.File, error) {
	f := excelize.NewFile()

	for _, sheet := range sheets {
		if _, err := f.NewSheet(sheet.SheetName); err != nil {
			return nil, err
		}

		for i, header := range sheet.Headers {
			if err := f.SetCellValue(sheet.SheetName, GetCellName(i, 1), header); err != nil {
				return nil, err
			}
		}

		baseIndex := 2
		if len(sheet.Headers) == 0 {
			baseIndex = 1
		}

		for i, row := range sheet.Rows {
			for j, val := range row {
				if err := f.SetCellValue(sheet.SheetName, GetCellName(j, baseIndex+i), val); err != nil {
					return nil, err
				}
			}
		}
	}

	if len(sheets) > 0 {
		f.SetActiveSheet(0)
	}

	return f, nil
}

// GetColumnName 获取列名 A-Z, AA-ZZ, AAA-ZZZ
func GetColumnName(col int) string {
	if col < 26 {
		return string(rune('A' + col))
	}

	return GetColumnName(col/26-1) + GetColumnName(col%26)
}

// GetCellName 获取单元格名称 A1, B2, AA1, AB1
func GetCellName(col, row int) string {
	return fmt.Sprintf("%s%d", GetColumnName(col), row)
}
相关推荐
老爸我爱你16 分钟前
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 上编译问题笔记
开发语言·c++
柯ran38 分钟前
C++面试准备一(常考)
开发语言·c++·面试
刺客-Andy41 分钟前
开发中常用的设计模式 用法及注意事项
开发语言·前端·javascript·设计模式
Antonio9151 小时前
【设计模式】装饰模式
开发语言·设计模式
kill bert1 小时前
第29周 面试题精讲(4)
java·开发语言
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧1 小时前
避雷 :C语言中 scanf() 函数的错误❌使用!!!
c语言·开发语言·数据结构·算法·visualstudio·visual studio
lili-felicity1 小时前
走进Java:String字符串的基本使用
java·开发语言
my_realmy2 小时前
Java 之「单调栈」:从入门到实战
java·大数据·开发语言·ide·python
重生之成了二本看我逆天改命走向巅峰2 小时前
Spring IOC 详解:基于 XML 配置与注解的依赖注入
xml·java·开发语言·笔记·后端·spring
小爬虫程序猿2 小时前
Java爬虫需要设置哪些请求头?
java·开发语言·爬虫