excelize 是 Go 中读写 Excel 最稳定活跃的库,创建文件需 NewFile() 后调 SaveAs() 或 WriteTo();批量写入推荐 SetSheetRow();读取大文件应避免 GetRows() 而用按行拉取;格式设置需 NewStyle() 再 SetCellStyle()。

excelize 是当前 Go 生态中读写 Excel(.xlsx)最稳定、维护最活跃的选择,xlsx 库虽历史久但已多年未更新(最后 commit 在 2021 年),不建议新项目使用。
怎么创建和保存一个 Excel 文件
核心就是两步:新建 *excelize.File 对象 → 调用 SaveAs() 或 WriteTo() 输出。不调用保存,所有写入都只在内存里,程序退出就丢。
-
NewFile()默认带一个叫Sheet1的工作表;如果想自定义名,用f.NewSheet("数据表"),再通过f.SetActiveSheet(index)激活它,否则写入可能进错 sheet - 保存时路径必须有写权限,Windows 下注意反斜杠转义问题,推荐统一用正斜杠或
filepath.Join() - 如果要输出到 HTTP 响应流(比如 Web 导出接口),别用
SaveAs(),改用f.WriteTo(w io.Writer),避免临时文件开销
怎么批量写入结构体数据到 Sheet
直接循环调用 SetCellValue() 写单个单元格效率低、易出错;更推荐用 SetSheetRow() 一次性写一整行。
- 列地址得从 1 开始(不是 0),
CoordinatesToCellName(col, row)可帮你把行列号转成A1这类格式,避免手拼出AA1这种非法地址 - 结构体字段顺序必须和表头严格对应;若字段多、顺序难控,建议先转成
[]interface{}切片再写 - 注意:
SetSheetRow()第三个参数是指针,传&row,漏掉&会导致静默失败(值没写进去)
读取时为什么 GetRows() 返回空或 panic
GetRows() 看似方便,但实际是把整张表加载进内存,遇到大文件(>5 万行)极易 OOM;而且它会把空行、隐藏行、合并单元格区域都当普通行返回,导致数据错位。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 真正安全的读法是按需拉取:用
GetCellValue("Sheet1", fmt.Sprintf("A%d", i))配合循环,自己控制行号,遇到空值就停 - 如果真要用
GetRows(),务必先确认 sheet 名是否正确——f.GetSheetMap()打印出来看看,常见错误是代码写Sheet1,实际文件里是工作表1或带空格 - Excel 单元格类型(数字/日期/文本)会影响
GetCellValue()返回值,比如日期可能变成浮点数,需要配合GetCellType()和GetTimeValue()处理
合并单元格、列宽、样式等基础格式怎么加
格式操作不是“锦上添花”,而是影响下游系统(如财务软件、BI 工具)能否正确识别数据的关键环节。
立即学习“go语言免费学习笔记(深入)”;
- 合并用
MergeCell("Sheet1", "A1", "C1"),起止坐标必须在同一 sheet,且左上角必须是真实存在的单元格(不能是Z999这种越界地址) - 设列宽用
SetColWidth("Sheet1", "A", "D", 15),中间字母范围必须连续,"A", "C"表示 A 到 C 列,不是 A 和 C 两列 - 字体、背景色等样式目前
excelize支持完整,但得先调f.NewStyle()创建样式 ID,再用SetCellStyle()绑定到单元格,步骤比写值繁琐得多,别漏掉f.NewStyle()返回的 ID
excelize 的文档虽然全,但很多细节藏在 GitHub Issues 里,比如合并单元格后写入内容必须写在左上角单元格,否则内容不显示;又比如中文 Windows 下打开文件报 invalid UTF-8,其实是文件路径含中文导致,得用 filepath.FromSlash() 预处理。这些坑不踩一遍,光看文档根本想不到。

















