做后端开发的人多半遇到过这个需求:导个报表、读个 Excel 模板、往表格里塞点数据。Go 生态里能干这活的库不少,但真正能打的没几个。今天聊一个——Excelize。
这是什么?
Excelize 是一个纯 Go 实现的 Excel 读写库,支持 XLAM / XLSM / XLSX / XLTM / XLTX 格式,对应的是 Microsoft Excel 2007 及以后版本的 Open XML 格式。项目从 2016 年开始,目前 GitHub 上 2 万出头 star,在 Go 的 Excel 库里基本是断层式领先。
仓库地址:https://github.com/qax-os/excelize
为什么选它?
几个实在的理由:
1. 纯 Go,零 CGO 依赖。 交叉编译不受影响,部署不折腾。这一点在容器化场景下很关键。
2. Streaming API 处理大数据。 如果你需要写入几十万行甚至更多数据,Excelize 提供了流式写入接口(StreamWriter),不需要把整个文件加载到内存。这在实际业务里是刚需,不是锦上添花。
3. 功能覆盖面广。 单元格读写、样式设置、合并单元格、条件格式、数据验证、图表(柱状图、饼图、折线图等)、图片插入、超链接、批注、公式计算(CalcCellValue)、Sheet 保护——基本覆盖了日常开发中 90% 以上的 Excel 操作场景。
4. 标准合规。 XML 生成遵循 ECMA-376 第五版第一部分规范,不是自己瞎凑的格式,兼容性有据可查。
安装
go get github.com/xuri/excelize/v2 |
当前最新版本 v2.10.1,发布于 2026 年 2 月。Go 版本要求 1.25.0 及以上。
写个最简示例
Go f := excelize.NewFile() defer f.Close() f.SetCellValue("Sheet1", "A1", "姓名") f.SetCellValue("Sheet1", "B1", "分数") f.SetCellValue("Sheet1", "A2", "张三") f.SetCellValue("Sheet1", "B2", 95) if err := f.SaveAs("result.xlsx"); err != nil { fmt.Println(err) } |
读也差不多:
Go f, err := excelize.OpenFile("result.xlsx") if err != nil { fmt.Println(err) return } defer f.Close() val, _ := f.GetCellValue("Sheet1", "B2") fmt.Println(val) |
API 风格就是这种平铺直叙的,没什么学习曲线。
几个值得说的点
图表功能:可以直接在代码里构造 Chart 对象插入到 Sheet 中,支持 3D 柱状图、饼图、折线图、散点图、雷达图等几十种类型,v2.10.1 还新增了数据点颜色设置和 drop line / high-low line 支持。
图片插入:支持 PNG、JPG、GIF,新版还加了 ICO 格式。可以控制缩放比例、偏移量,还能设置是否打印和锁定。
公式计算:CalcCellValue 可以在服务端直接算公式结果,不需要装 Excel。目前支持的函数列表持续扩展,v2.10.1 新增了 SORTBY 和 UNIQUE。
流式写入:用 NewStreamWriter 创建流式写入器,逐行写入,内存占用可控。适合报表导出那种一次写几十万行的场景。
项目状态
主要维护者 xuri,一个人贡献了 961 次 commit,项目持续维护中,issue 响应也算及时。BSD 3-Clause 开源协议,商用没问题。
局限性
客观说几个不足:
不支持旧版 .xls 格式(Excel 97-2003)。如果一定要处理 .xls,得用其他方案转换。
公式计算没有做到 100% 覆盖 Excel 全部函数,复杂场景可能会有不支持的情况,用之前最好查一下文档确认。
单元格样式设置的 API 略显琐碎,样式对象字段多,初次上手可能要翻几遍文档。
文档
官网:https://xuri.me/excelize
Go Doc:https://pkg.go.dev/github.com/xuri/excelize/v2
源码:https://github.com/qax-os/excelize
夜雨聆风