乐于分享
好东西不私藏

Excelize:Go 语言里处理 Excel 最靠谱的开源库

Excelize:Go 语言里处理 Excel 最靠谱的开源库

做后端开发的人多半遇到过这个需求:导个报表、读个 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