乐于分享
好东西不私藏

Go操作Excel实战详解:github.com/xuri/excelize/v2

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. 1. 大文件使用 StreamWriter
  2. 2. 避免频繁调用 Save
  3. 3. 多文件处理可以并发
  4. 4. 尽量减少重复读取单元格

七、常见问题

不支持 .xls

excelize 仅支持:

  • • .xlsx
  • • .xlsm
  • • .xltx

旧版 .xls 需要转换后再处理。


公式不会自动计算

excelize 不会像 Excel 一样执行公式。

读取到的是缓存值。

如果文件从未被 Excel 计算过,公式结果可能为空。


内存占用问题

普通模式会加载整个文件到内存。

超大文件建议:

  • • 使用流式 API
  • • 分批处理

八、典型应用架构

如果在桌面工具中使用,例如 Wails 项目:

前端 VueGo 后端excelize生成或处理 Excel

优点:

  • • 无需依赖 Excel
  • • 不会出现 COM 崩溃
  • • 更容易打包分发

九、总结

github.com/xuri/excelize/v2 是目前 Go 生态中最成熟的 Excel 操作库。

适合:

  • • Excel 批量处理
  • • 报表生成
  • • 数据清洗
  • • CSV 转 XLSX
  • • 模板填充

如果你的项目目标是稳定、跨平台、高性能批量处理,那么excelize是首选方案。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Go操作Excel实战详解:github.com/xuri/excelize/v2

评论 抢沙发

6 + 5 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮