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应用生态系统完美集成

六、性能特点

  1. 流式API:处理10万行甚至百万行数据时,内存占用控制在百MB级别,避免内存溢出问题
  2. 高性能:比常规方法处理100万行数据时,内存占用可从数GB降低至百MB级别,处理速度更快
  3. 格式兼容性:严格遵循ECMA-376和ISO/IEC 29500标准,确保与其他Excel工具的兼容性
  4. 功能丰富:支持处理包含样式、图片、图表、透视表等复杂元素的文档

七、总结

Excelize是Go语言处理Excel文件的首选库,它提供了全面的功能、出色的性能和良好的兼容性。无论是简单的数据导入导出,还是复杂的报表生成和数据分析,Excelize都能提供高效、可靠的解决方案。

对于需要处理Excel文件的Go应用,Excelize是最佳选择。通过上述示例,你可以快速上手并集成到你的项目中,大大提高数据处理效率和业务价值。

提示:在生产环境中使用时,建议根据实际需求进行性能调优,并充分利用Excelize的流式API处理大数据量场景。