Go操作Excel实战详解:github.com/xuri/excelize/v2
在开发 Excel 批量处理工具时,例如多 Sheet 汇总、批量清理公式、XLSX 转换、报表生成等,如果不希望依赖 Windows COM 或本地安装 Excel,那么最合适的方案是:
github.com/xuri/excelize/v2
这是目前 Go 生态中最成熟、使用最广泛的 Excel 操作库之一。
一、excelize 是什么
excelize 是一个纯 Go 实现的 Excel 读写库。
项目作者是 Xuri。
核心特点:
-
• 不依赖 Excel 软件 -
• 支持 Windows / macOS / Linux -
• 适合桌面程序和服务器程序 -
• 支持 xlsx、xlsm、模板文件 -
• 性能稳定 -
• API 设计清晰
它本质是直接操作 Office Open XML 结构,而不是调用 Excel 进程。
二、为什么推荐 excelize
和 COM 方案相比:
excelize 的优势:
-
• 不需要安装 Office -
• 不会残留 Excel 进程 -
• 不存在 COM 线程模型问题 -
• 可以运行在服务器环境 -
• 更适合批量自动化处理
COM 方案适合需要调用宏或真实 Excel 功能的场景。
如果只是做:
-
• Excel 数据合并 -
• 批量清理公式 -
• 批量导出报表 -
• SaaS 报表下载 -
• CSV 转 XLSX
excelize 是更优解。
三、基础使用示例
创建 Excel 文件
package mainimport"github.com/xuri/excelize/v2"funcmain() { f := excelize.NewFile() f.SetCellValue("Sheet1", "A1", "Hello") f.SetCellValue("Sheet1", "B1", 123) f.SaveAs("test.xlsx")}
打开并读取文件
f, err := excelize.OpenFile("test.xlsx")if err != nil {panic(err)}value, _ := f.GetCellValue("Sheet1", "A1")println(value)
遍历整张表
rows, _ := f.GetRows("Sheet1")for _, row := range rows {for _, col := range row {print(col, "\t") }println()}
四、常见实战场景
结合实际开发经验,下面是几个高频需求示例。
1. 批量清理公式(将公式转为值)
rows, _ := f.GetRows("Sheet1")for i, row := range rows {for j := range row { cell, _ := excelize.CoordinatesToCellName(j+1, i+1) value, _ := f.GetCellValue("Sheet1", cell) f.SetCellValue("Sheet1", cell, value) }}
适合做 Excel 表格公式批量清理工具。
2. 多 Sheet 数据汇总
target := excelize.NewFile()for _, sheet := range f.GetSheetList() { rows, _ := f.GetRows(sheet)for i, row := range rows {for j, val := range row { cell, _ := excelize.CoordinatesToCellName(j+1, i+1) target.SetCellValue("Sheet1", cell, val) } }}
适合多表汇总工具。
3. 设置样式
style, _ := f.NewStyle(&excelize.Style{ Font: &excelize.Font{ Bold: true, Color: "FF0000", },})f.SetCellStyle("Sheet1", "A1", "A1", style)
4. 插入图片
f.AddPicture("Sheet1", "A1", "logo.png", nil)
五、大数据处理建议
如果数据量超过 5 万行,建议使用流式写入。
streamWriter, _ := f.NewStreamWriter("Sheet1")row := []interface{}{"ID", "Name", "Price"}streamWriter.SetRow("A1", row)streamWriter.Flush()
优点:
-
• 内存占用低 -
• 写入速度快 -
• 适合报表导出
六、性能优化建议
-
1. 大文件使用 StreamWriter -
2. 避免频繁调用 Save -
3. 多文件处理可以并发 -
4. 尽量减少重复读取单元格
七、常见问题
不支持 .xls
excelize 仅支持:
-
• .xlsx -
• .xlsm -
• .xltx
旧版 .xls 需要转换后再处理。
公式不会自动计算
excelize 不会像 Excel 一样执行公式。
读取到的是缓存值。
如果文件从未被 Excel 计算过,公式结果可能为空。
内存占用问题
普通模式会加载整个文件到内存。
超大文件建议:
-
• 使用流式 API -
• 分批处理
八、典型应用架构
如果在桌面工具中使用,例如 Wails 项目:
前端 Vue↓Go 后端↓excelize↓生成或处理 Excel
优点:
-
• 无需依赖 Excel -
• 不会出现 COM 崩溃 -
• 更容易打包分发
九、总结
github.com/xuri/excelize/v2 是目前 Go 生态中最成熟的 Excel 操作库。
适合:
-
• Excel 批量处理 -
• 报表生成 -
• 数据清洗 -
• CSV 转 XLSX -
• 模板填充
如果你的项目目标是稳定、跨平台、高性能批量处理,那么excelize是首选方案。
夜雨聆风
