【Go】golang操作excel的高性能库——excelize/v2
介绍
Excelize是一个纯Go编写的库,提供了一组功能,允许你向XLAM / XLSM / XLSX / XLTM / XLTX文件写入和读取。支持读取和写入由Microsoft Excel™ 2007及更高版本生成的电子表格文档。通过高度兼容性支持复杂组件,并提供了流式API,用于生成或从包含大量数据的工作表中读取数据。此库需要Go版本1.16或更高版本。可以使用Go的内置文档工具查看完整文档,也可以在go.dev和文档引用中在线查阅。
另外还有另外一个库:github.com/360EntSecGroup-Skylar/excelize/v2,不过它已经没了,或者说它和github.com/xuri/excelize/v2是一个东西,用法功能都完全一样。。。。
文档与源码
Github源码:https://github.com/qax-os/excelize
中文文档:https://xuri.me/excelize/zh-hans/
安装
go get github.com/xuri/excelize/v2
快速开始
创建 Excel 文档
package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f := excelize.NewFile() defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() // 创建一个工作表 index, err := f.NewSheet("Sheet2") if err != nil { fmt.Println(err) return } // 设置单元格的值 f.SetCellValue("Sheet2", "A2", "Hello world.") f.SetCellValue("Sheet1", "B2", 100) // 设置工作簿的默认工作表 f.SetActiveSheet(index) // 根据指定路径保存文件 if err := f.SaveAs("Book1.xlsx"); err != nil { fmt.Println(err) } }
读取 Excel 文档
package main import ( "fmt" "github.com/xuri/excelize/v2"" ) func main() { f, err := excelize.OpenFile("Book1.xlsx") if err != nil { fmt.Println(err) return } // 获取工作表中指定单元格的值 cell, err := f.GetCellValue("Sheet1", "B2") if err != nil { fmt.Println(err) return } // 获取 Sheet1 上所有单元格 rows, err := f.GetRows("Sheet1") for _, row := range rows { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } }
打开数据流
OpenReader 从 io.Reader 读取数据流。、
创建一个简单的 HTTP 服务器接收上传的电子表格文档,向接收到的电子表格文档添加新工作表,并返回下载响应:
package main import ( "fmt" "net/http" "github.com/xuri/excelize/v2"" ) func process(w http.ResponseWriter, req *http.Request) { file, _, err := req.FormFile("file") if err != nil { fmt.Fprintf(w, err.Error()) return } defer file.Close() f, err := excelize.OpenReader(file) if err != nil { fmt.Fprintf(w, err.Error()) return } f.NewSheet("NewSheet") w.Header().Set("Content-Disposition", "attachment; filename=Book1.xlsx") w.Header().Set("Content-Type", req.Header.Get("Content-Type")) if _, err := f.WriteTo(w); err != nil { fmt.Fprintf(w, err.Error()) } return } func main() { http.HandleFunc("/process", process) http.ListenAndServe(":8090", nil) }
流式写入
func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error)
NewStreamWriter 通过给定的工作表名称返回流式写入器,用于向已存在的空白工作表写入大规模数据。请注意通过此方法按行向工作表写入数据后,必须调用 Flush 函数来结束流式写入过程,并需要确保所写入的行号是递增的,普通函数不能与流式函数混合使用在工作表中写入数据。写入过程中内存数据超过 16MB 时,流写入器将尝试使用磁盘上的临时文件来减少内存使用,此时您无法获取单元格值。例如,向工作表流式按行写入 102400 行 x 50 列带有样式的数据:
f := excelize.NewFile() defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() sw, err := f.NewStreamWriter("Sheet1") if err != nil { fmt.Println(err) return } styleID, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "777777"}}) if err != nil { fmt.Println(err) return } // 流式设置单元格的公式和值: if err := sw.SetRow("A1", []interface{}{ excelize.Cell{StyleID: styleID, Value: "Data"}, []excelize.RichTextRun{ {Text: "Rich ", Font: &excelize.Font{Color: "2354e8"}}, {Text: "Text", Font: &excelize.Font{Color: "e83723"}}, }, }, // 流式设置单元格的值和行样式: excelize.RowOpts{Height: 45, Hidden: false}); err != nil { fmt.Println(err) return } for rowID := 2; rowID <= 102400; rowID++ { row := make([]interface{}, 50) for colID := 0; colID < 50; colID++ { row[colID] = rand.Intn(640000) } cell, err := excelize.CoordinatesToCellName(1, rowID) if err != nil { fmt.Println(err) break } if err := sw.SetRow(cell, row); err != nil { fmt.Println(err) break } } if err := sw.Flush(); err != nil { fmt.Println(err) return } if err := f.SaveAs("Book1.xlsx"); err != nil { fmt.Println(err) }
SetRow 通过给定的起始坐标和指向数组类型“切片”的指针将数据按行流式写入工作表中。请注意,在设置行之后,必须调用 Flush 函数来结束流式写入过程,并需要确所保写入的行号是递增的。
相关 Excel 开源类库性能对比
下图展示了 Go, Python, Java, PHP 和 NodeJS 语言中典型 Excel 开源基础库,基于普通个人计算机 (2.6 GHz 6-Core Intel Core i7, 16 GB 2667 MHz DDR4, 500GB SSD, macOS Monterey 12.3.1) 生成 50 列 102400 行纯文本单元格的性能表现。
原文链接https://blog.csdn.net/General_zy/article/details/132327485
猜你喜欢
- 【Go】Go语言的特点和优势
- Go语言是一种开源的编程语言,它在2009年由Google开发并在2012年正式发布。Go语言的主要设计目标是提供一种简单有效的方法来构建简单、可靠、高效的软件。 Go语言的主要特点和优势包括: 静态类型:Go语言是一种静态类型的语言,这意味着所有变量在编译时就必须确定其数据类型。 自动垃圾回收:Go语言具有自动的垃圾回收机制,这意味着开发者不需要手动管理内存。 并行进程:Go语言支持并行进程,这使得开发者可以利用多核处理器的优势来编写并发程序。&nbs
- 【Go】go依赖注入库samber/do使用
- 介绍以简单和高效而闻名的Go语言在其1.18版本中引入了泛型,这可以显着减少大量代码生成的需要,使该语言更加强大和灵活。如果您有兴趣, Go 泛型教程 是很好的学习资源。通过使用 Go 的泛型,samber/do库为依赖注入 (DI) 提供了一个很好的解决方案。依赖注入是一种重要的设计模式,它促进对象及其依赖关系之间的松散耦合,从而提高代码模块化性、可测试性和可维护性。泛型和依赖注入的结合进一步提升了 Go 在创建高效、可扩展软件方面的潜力。在本文中,您将学习如何使用 samber/do 提供依
- 【Go】golang可以写桌面吗
- 本文操作环境:Windows10系统、go1.20版本、DELL G3电脑。Golang是一种强大且灵活的编程语言,它是由Google开发的,并在开源社区中得到了广泛的支持和应用。虽然Golang最初是作为一种服务器端语言设计的,用于处理并发请求和高性能的网络应用程序,但它也可以用于编写桌面应用程序。Golang的设计目标之一是提供简洁、高效的开发体验,并且具有垃圾回收机制和并发编程的优势。这些特性使得Golang成为一种理想的语言来开发桌面应用程序,尤其是对于需要高性能和并发处理的应用程序。虽
- 【Go】VSCode配置Go语言开发库
- 1. Go插件配置安装好vscode后,打开插件页面,搜索Go相关插件,如图,选择第一个安装。插件安装完成后,点击设置图标,选择Extension Setting选项,进入插件设置页面。在插件设置选项中,选择待遇Edit in setting.json的选项,点击进入setting.json配置文件。将GOPATH和GOROOT配置到setting.json文件,如下图所示:配置完成后,就可以开始写go文件。2. Go开发语言包设置这时候vscode会提示未安装ygo语言包,根据右下角提示,点击
- 【Go】go语言的特点和优势
- Go语言是一种开源的、编译型的、并发型的编程语言,由谷歌于2009年推出。Go语言的设计目标是简单、高效、可靠,并能够轻松地构建大型分布式系统。优势简单易学: Go语言的语法非常简单,学习曲线平缓,即使是初学者也能快速掌握。高效: Go语言的编译速度非常快,并且生成的二进制文件也非常小,这使得它非常适合构建高性能的应用程序。并发: Go语言内置了对并发编程的支持,使得开发人员可以轻松地编写并发程序。可靠: Go语言提供了许多内置的错误处理机制,这使得它非常适合构建可靠的应用程序。跨平台: Go语
- 【Go】Golang标准库介绍(二)
- 1. debug 库 (各种调试文件格式访问及调试功能在 Go 语言的标准库中,并没有一个名为 debug 的独立库。然而,Go 提供了一系列的工具和包,用于调试和性能分析。这些工具和包包括 debug/pprof、runtime/pprof、net/http/pprof 等,用于生成和分析性能剖析数据。相关的包和工具:1. runtime/pprof: 提供了运行时性能分析的功能,可以用于查看 CPU 和内存的使用情况。它通过在代码中插入特殊的语句来收集
- 【Go】常用的6款Go语言Web框架
- 前言由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web”框架”为主。这里稍微打了个引号,因为大部分”框架”从设计和功能定位上来讲,充其量都只能算是一个组件,需要项目使用的话得自己四处再去找找其他的组件,或者自己造轮子。如果用于Web开发,这些”框架”的Web开发能力均已完备,无太大差别,且均是自标准库net/http.Server的二次封装。由于框架众多,这里笔者只选择了几个曾做过技术选型评估、较为熟悉,且目前比较流行和典型的Golang”框架”,从适
- 【Go】Linux下搭建go开发环境
- 配置go编译器下载go从go官方网站下载最新的安装包 以go1.18.1.linux-amd64.tar.gz为例,放在用户的home目录。解压使用命令 tar -xzvf go1.18.1.linux-amd64.tar.gz 解压配置打开~/.bashrc文件,写入如下配置:export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin export PATH=$PATH:$GOPATH/bin:/usr/local