golang高效读取Excel XML格式数据插件库xlsx的使用

Golang高效读取Excel XML格式数据插件库xlsx的使用

介绍

xlsx是一个用于简化Go程序中读取和写入Excel XML格式(自2002年以来Microsoft Excel使用的格式)的库。

当前状态

该项目目前处于活跃维护状态,主要维护者会审查补丁并发布新版本,但不会主动进行新功能开发。

使用示例

下面是一个完整的示例,展示如何使用xlsx库高效读取Excel文件:

package main

import (
	"fmt"
	"github.com/tealeg/xlsx/v3"
)

func main() {
	// 打开Excel文件
	xlFile, err := xlsx.OpenFile("example.xlsx")
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}

	// 遍历所有工作表
	for _, sheet := range xlFile.Sheets {
		fmt.Printf("工作表名称: %s\n", sheet.Name)
		
		// 逐行读取数据
		err := sheet.ForEachRow(func(row *xlsx.Row) error {
			// 遍历行中的每个单元格
			for _, cell := range row.Cells {
				text, _ := cell.FormattedValue()
				fmt.Printf("%s\t", text)
			}
			fmt.Println()
			return nil
		})
		
		if err != nil {
			fmt.Printf("读取行时出错: %v\n", err)
		}
	}
}

更高效的内存使用方式

对于大型Excel文件,可以使用RowLimit选项限制内存使用:

func readLargeExcel() {
	// 使用RowLimit选项限制内存使用
	file, err := xlsx.OpenFile("large.xlsx", xlsx.RowLimit(1000))
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}

	// 处理文件...
}

写入Excel文件示例

func writeExcel() {
	// 创建新文件
	file := xlsx.NewFile()
	
	// 添加工作表
	sheet, err := file.AddSheet("Sheet1")
	if err != nil {
		fmt.Printf("添加工作表失败: %v\n", err)
		return
	}
	
	// 添加行
	row := sheet.AddRow()
	
	// 添加单元格并设置值
	cell := row.AddCell()
	cell.Value = "Hello"
	
	cell = row.AddCell()
	cell.Value = "World"
	
	// 保存文件
	err = file.Save("output.xlsx")
	if err != nil {
		fmt.Printf("保存文件失败: %v\n", err)
	}
}

版本说明

  • 1.x.x: 稳定版本,适合已有项目
  • 2.x.x: 包含API重大变更
  • 3.x.x: 最新版本,增加了FileOption功能

注意事项

  1. 对于非常大的Excel文件,建议使用RowLimit选项控制内存使用
  2. 写入文件时确保目标目录有写入权限
  3. 处理不同数据类型时注意错误处理

xlsx库提供了完整的Excel文件读写功能,是Go语言处理Excel XML格式文件的高效解决方案。


更多关于golang高效读取Excel XML格式数据插件库xlsx的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高效读取Excel XML格式数据插件库xlsx的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang高效读取Excel XML格式数据:xlsx库使用指南

在Golang中处理Excel文件时,tealeg/xlsx是一个功能强大且易于使用的库,特别适合处理Excel XML格式(.xlsx)文件。下面我将详细介绍如何使用这个库高效读取Excel数据。

安装xlsx库

首先安装xlsx库:

go get github.com/tealeg/xlsx/v3

基本读取操作

1. 打开Excel文件

package main

import (
	"fmt"
	"github.com/tealeg/xlsx/v3"
)

func main() {
	// 打开Excel文件
	xlFile, err := xlsx.OpenFile("example.xlsx")
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}
	defer func() {
		// 如果有需要,可以在这里执行清理操作
	}()
	
	// 处理Excel数据
	processExcel(xlFile)
}

2. 遍历工作表和工作表内容

func processExcel(file *xlsx.File) {
	// 遍历所有工作表
	for _, sheet := range file.Sheets {
		fmt.Printf("工作表名称: %s\n", sheet.Name)
		
		// 遍历工作表中的行
	sheet.ForEachRow(func(row *xlsx.Row) error {
			// 遍历行中的单元格
			row.ForEachCell(func(cell *xlsx.Cell) error {
				value, _ := cell.FormattedValue()
				fmt.Printf("%s\t", value)
				return nil
			})
			fmt.Println() // 换行
			return nil
		})
	}
}

高效读取技巧

1. 使用流式读取处理大文件

对于大型Excel文件,可以使用流式读取来减少内存消耗:

func readLargeExcel(filePath string) error {
	xlFile, err := xlsx.OpenFile(filePath)
	if err != nil {
		return err
	}
	
	for _, sheet := range xlFile.Sheets {
		rowChannel := make(chan xlsx.Row)
		go func() {
			defer close(rowChannel)
			err := sheet.ForEachRow(func(row *xlsx.Row) error {
				rowChannel <- *row
				return nil
			})
			if err != nil {
				fmt.Printf("读取行时出错: %v\n", err)
			}
		}()
		
		for row := range rowChannel {
			processRow(&row)
		}
	}
	return nil
}

func processRow(row *xlsx.Row) {
	// 处理每一行数据
}

2. 按列读取数据

func readByColumn(sheet *xlsx.Sheet, colIndex int) ([]string, error) {
	var colData []string
	
	err := sheet.ForEachRow(func(row *xlsx.Row) error {
		cell := row.GetCell(colIndex)
		value, err := cell.FormattedValue()
		if err != nil {
			return err
		}
		colData = append(colData, value)
		return nil
	})
	
	return colData, err
}

3. 处理不同类型的数据

func getCellValue(cell *xlsx.Cell) interface{} {
	switch cell.Type() {
	case xlsx.CellTypeString:
		return cell.String()
	case xlsx.CellTypeNumeric:
		val, _ := cell.Float()
		return val
	case xlsx.CellTypeBool:
		val, _ := cell.Bool()
		return val
	case xlsx.CellTypeDate:
		val, _ := cell.GetTime(false)
		return val
	default:
		return cell.Value
	}
}

高级功能

1. 读取合并单元格

func readMergedCells(sheet *xlsx.Sheet) {
	for _, mergedRange := range sheet.MergedCells {
		fmt.Printf("合并单元格范围: %s\n", mergedRange.Ref)
		cell, _ := sheet.Cell(mergedRange.Left(), mergedRange.Top())
		value, _ := cell.FormattedValue()
		fmt.Printf("合并单元格值: %s\n", value)
	}
}

2. 处理公式

func readFormula(sheet *xlsx.Sheet, row, col int) {
	cell := sheet.Cell(row, col)
	if cell.IsFormula() {
		fmt.Printf("公式: %s\n", cell.Formula())
		value, _ := cell.FormattedValue()
		fmt.Printf("计算结果: %s\n", value)
	}
}

性能优化建议

  1. 批量处理数据:避免在循环中频繁进行I/O操作
  2. 限制并发:处理大量文件时,使用worker pool限制并发数量
  3. 重用对象:尽可能重用xlsx.File和xlsx.Sheet对象
  4. 选择性读取:只读取需要的行和列,而不是整个文件

完整示例

package main

import (
	"fmt"
	"log"
	"time"
	
	"github.com/tealeg/xlsx/v3"
)

type Product struct {
	ID       int
	Name     string
	Price    float64
	Quantity int
	Date     time.Time
}

func main() {
	start := time.Now()
	
	products, err := readProductsFromExcel("products.xlsx")
	if err != nil {
		log.Fatalf("读取Excel失败: %v", err)
	}
	
	for _, p := range products {
		fmt.Printf("%+v\n", p)
	}
	
	fmt.Printf("处理完成,耗时: %v\n", time.Since(start))
}

func readProductsFromExcel(filePath string) ([]Product, error) {
	var products []Product
	
	xlFile, err := xlsx.OpenFile(filePath)
	if err != nil {
		return nil, err
	}
	
	sheet := xlFile.Sheets[0] // 假设数据在第一个工作表
	
	// 跳过标题行,从第二行开始
	rowIndex := 1
	for {
		row, err := sheet.Row(rowIndex)
		if err != nil || row == nil {
			break
		}
		
		product := Product{}
		
		// 读取ID
		if cell := row.GetCell(0); cell != nil {
			product.ID, _ = cell.Int()
		}
		
		// 读取名称
		if cell := row.GetCell(1); cell != nil {
			product.Name = cell.String()
		}
		
		// 读取价格
		if cell := row.GetCell(2); cell != nil {
			product.Price, _ = cell.Float()
		}
		
		// 读取数量
		if cell := row.GetCell(3); cell != nil {
			product.Quantity, _ = cell.Int()
		}
		
		// 读取日期
		if cell := row.GetCell(4); cell != nil {
			product.Date, _ = cell.GetTime(false)
		}
		
		products = append(products, product)
		rowIndex++
	}
	
	return products, nil
}

xlsx库提供了丰富的功能来处理Excel文件,通过合理使用这些功能,可以高效地读取和处理Excel XML格式数据。对于特别大的文件,建议使用流式读取方法以避免内存问题。

回到顶部