Go语言电子表格处理库
Excelize 是 Go 语言中功能强大、性能优越的开源 Excel 文件处理库,全面支持 XLSX 等格式的读写、样式设置、图表生成、数据验证、批注、流式大数据处理等高级特性,适用于企业报表、数据分析、自动化办公、财务系统等多种场景,兼容 ECMA-376/ISO 标准,配合 Go 1.25.1 可高效构建跨平台、高可靠性的 Excel 处理应用。
一、简介
Excelize是使用Go语言开发的免费开源跨平台库,提供对Office Excel文档的读写操作API。该库遵循ECMA-376和ISO/IEC 29500国际标准,支持读写Microsoft Excel™ 2007及以上版本生成的电子表格文件,兼容XLAM、XLSM、XLSX、XLTM、XLTX等多种格式。
截至2025年12月,Excelize最新版本为v2.8.1,要求Go语言版本1.15或更高(推荐使用1.25.1+)。Excelize在性能、功能完整性和兼容性方面均显著领先于其他Go Excel库,是企业级Go应用处理Excel文件的首选方案。
二、安装与环境要求
# 安装Excelize库
go get github.com/xuri/excelize/v2
三、核心功能详解
1. 基础操作
- 单元格与行列:赋值、读取、合并单元格、调整行高列宽、隐藏/保护行列
- 工作簿与工作表:创建新工作簿、读取已有工作簿、新增/删除工作表、保护工作表
- 格式转换:支持CSV与XLSX的双向转换
- 文档增强:设置页眉页脚、添加单元格批注、配置文档属性
2. 高级应用
- 数据可视化:支持折线图、柱状图、饼图等18种图表类型
- 公式计算:支持Excel内置公式(如SUM、VLOOKUP、IF等)的写入与计算
- 模板生成:基于已有Excel模板批量填充数据
- 大数据处理:流式API处理百万级数据
四、详细代码示例
1. 基础操作:创建和写入Excel文件
package main
import (
"fmt"
"log"
"github.com/xuri/excelize/v2"
)
func main() {
// 创建新工作簿
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
log.Fatalf("关闭文件失败: %v", err)
}
}()
// 创建工作表
sheetName := "Sheet1"
index, err := f.NewSheet(sheetName)
if err != nil {
log.Fatalf("创建工作表失败: %v", err)
}
// 设置工作表标题
f.SetCellValue(sheetName, "A1", "姓名")
f.SetCellValue(sheetName, "B1", "年龄")
f.SetCellValue(sheetName, "C1", "城市")
// 写入数据
data := [][]interface{}{
{"张三", 25, "北京"},
{"李四", 30, "上海"},
{"王五", 28, "广州"},
}
for i, rowData := range data {
for j, cellValue := range rowData {
column := string('A' + j)
f.SetCellValue(sheetName, fmt.Sprintf("%s%d", column, i+2), cellValue)
}
}
// 设置单元格样式(居中)
style, err := f.NewStyle(&excelize.Style{
Alignment: &excelize.Alignment{
Horizontal: "center",
Vertical: "center",
},
})
if err != nil {
log.Fatalf("创建样式失败: %v", err)
}
// 应用样式到A1:C3区域
f.SetCellStyle(sheetName, "A1", "C3", style)
// 调整列宽
f.SetColWidth(sheetName, "A", "A", 15)
f.SetColWidth(sheetName, "B", "B", 10)
f.SetColWidth(sheetName, "C", "C", 15)
// 调整行高
f.SetRowHeight(sheetName, 1, 25)
// 设置活动工作表
f.SetActiveSheet(index)
// 保存文件
if err := f.SaveAs("output.xlsx"); err != nil {
log.Fatalf("保存文件失败: %v", err)
}
fmt.Println("Excel文件创建成功! 保存为 output.xlsx")
}
2. 读取Excel文件
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
"log"
)
func main() {
// 打开现有Excel文件
f, err := excelize.OpenFile("output.xlsx")
if err != nil {
log.Fatalf("打开文件失败: %v", err)
}
defer func() {
if err := f.Close(); err != nil {
log.Fatalf("关闭文件失败: %v", err)
}
}()
// 读取单个单元格
cellValue, err := f.GetCellValue("Sheet1", "A2")
if err != nil {
log.Fatalf("读取单元格失败: %v", err)
}
fmt.Println("A2单元格的值:", cellValue)
// 读取整行数据
rowData, err := GetRow(f, "Sheet1", 2)
if err != nil {
log.Fatalf("读取行数据失败: %v", err)
}
fmt.Println("第2行数据:", rowData)
// 读取所有行
rows, err := f.GetRows("Sheet1")
if err != nil {
log.Fatalf("读取所有行失败: %v", err)
}
// 打印表格数据
fmt.Println("\n完整表格数据:")
for i, row := range rows {
fmt.Printf("第%d行: ", i+1)
for _, cell := range row {
fmt.Printf("%s\t", cell)
}
fmt.Println()
}
}
// GetRow 封装:获取指定行号的数据(行号从1开始)
func GetRow(f *excelize.File, sheet string, rowNumber int) ([]string, error) {
if rowNumber < 1 {
return nil, fmt.Errorf("行号必须 >= 1")
}
rows, err := f.GetRows(sheet)
if err != nil {
return nil, err
}
idx := rowNumber - 1
if idx >= len(rows) {
return []string{}, nil // 返回空行(无错误)
}
return rows[idx], nil
}
3. 高级功能:添加图表
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
"log"
)
func main() {
// 创建新工作簿
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
log.Fatalf("关闭文件失败: %v", err)
}
}()
// 创建工作表
sheetName := "Sheet1"
index, err := f.NewSheet(sheetName)
if err != nil {
log.Fatalf("创建工作表失败: %v", err)
}
// 添加数据
f.SetCellValue(sheetName, "A1", "产品")
f.SetCellValue(sheetName, "B1", "销量")
f.SetCellValue(sheetName, "A2", "产品A")
f.SetCellValue(sheetName, "B2", 150)
f.SetCellValue(sheetName, "A3", "产品B")
f.SetCellValue(sheetName, "B3", 250)
f.SetCellValue(sheetName, "A4", "产品C")
f.SetCellValue(sheetName, "B4", 350)
chart := excelize.Chart{
Type: excelize.Col3DClustered, // 使用官方常量(推荐)
Series: []excelize.ChartSeries{
{
Name: "销售数据",
Categories: "Sheet1!$A$2:$A$4", // X轴:类别(产品名)
Values: "Sheet1!$B$2:$B$4", // Y轴:数值(销量)
},
},
}
// 插入图表
if err := f.AddChart(sheetName, "D1", &chart); err != nil {
log.Fatalf("添加图表失败: %v", err)
}
// 设置活动工作表
f.SetActiveSheet(index)
// 保存文件
if err := f.SaveAs("chart_output.xlsx"); err != nil {
log.Fatalf("保存文件失败: %v", err)
}
fmt.Println("图表Excel文件创建成功! 保存为 chart_output.xlsx")
}
4. 流式处理大数据量
package main
import (
"fmt"
"log"
"github.com/xuri/excelize/v2"
)
func main() {
// 创建新工作簿
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
log.Fatalf("关闭文件失败: %v", err)
}
}()
// 创建工作表
sheetName := "Sheet1"
index, err := f.NewSheet(sheetName)
if err != nil {
log.Fatalf("创建工作表失败: %v", err)
}
// 设置标题
f.SetCellValue(sheetName, "A1", "ID")
f.SetCellValue(sheetName, "B1", "Name")
f.SetCellValue(sheetName, "C1", "Value")
// 流式写入数据(100万行)
const rowCount = 1000000
for i := 2; i <= rowCount+1; i++ {
f.SetCellValue(sheetName, fmt.Sprintf("A%d", i), i-1)
f.SetCellValue(sheetName, fmt.Sprintf("B%d", i), fmt.Sprintf("Item %d", i-1))
f.SetCellValue(sheetName, fmt.Sprintf("C%d", i), float64(i-1)*1.5)
}
// 设置活动工作表
f.SetActiveSheet(index)
// 保存文件(流式处理避免内存溢出)
if err := f.SaveAs("large_data.xlsx"); err != nil {
log.Fatalf("保存文件失败: %v", err)
}
fmt.Printf("成功创建包含 %d 行数据的Excel文件!\n", rowCount)
fmt.Println("文件已保存为 large_data.xlsx")
}
五、适用场景详解
1. 企业级报表系统
- 生成月度销售报表、季度财务分析报告
- 自动化生成包含图表和数据透视表的业务报表
- 从数据库导出数据并格式化为专业报表
2. 数据分析与可视化
- 处理百万级数据集进行分析
- 生成交互式图表(折线图、柱状图、饼图等)
- 结合其他数据分析库(如gonum)进行深度分析
3. 云计算与边缘计算
- 在资源受限的环境中高效处理Excel文件
- 通过流式API处理大数据量,避免内存溢出
- 为云服务提供Excel数据处理能力
4. 财务与敏感数据处理
- 生成合规的财务报表
- 通过数据验证确保数据录入准确性
- 保护敏感数据(如设置工作表保护)
5. 业务流程自动化
- 从Excel导入配置信息(如游戏配置、业务规则)
- 自动化生成合同、发票等文档
- 基于Excel模板批量生成文档
6. 跨平台应用
- 无需针对不同操作系统做适配
- 在Windows、macOS、Linux上无缝运行
- 与现有Go应用生态系统完美集成
六、性能特点
- 流式API:处理10万行甚至百万行数据时,内存占用控制在百MB级别,避免内存溢出问题
- 高性能:比常规方法处理100万行数据时,内存占用可从数GB降低至百MB级别,处理速度更快
- 格式兼容性:严格遵循ECMA-376和ISO/IEC 29500标准,确保与其他Excel工具的兼容性
- 功能丰富:支持处理包含样式、图片、图表、透视表等复杂元素的文档
七、总结
Excelize是Go语言处理Excel文件的首选库,它提供了全面的功能、出色的性能和良好的兼容性。无论是简单的数据导入导出,还是复杂的报表生成和数据分析,Excelize都能提供高效、可靠的解决方案。
对于需要处理Excel文件的Go应用,Excelize是最佳选择。通过上述示例,你可以快速上手并集成到你的项目中,大大提高数据处理效率和业务价值。
提示:在生产环境中使用时,建议根据实际需求进行性能调优,并充分利用Excelize的流式API处理大数据量场景。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

