先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用Excel~
GitHub链接:https://github.com/qax-os/excelize
Excelize是一个用纯Go语言编写的库,提供了一组函数,可以对XLAM / XLSM / XLSX / XLTM / XLTX文件进行读写。支持读写由Microsoft Excel™2007及以后版本生成的电子表格文档。通过高兼容性支持复杂组件,并提供流API从具有大量数据的工作表中生成或读取数据。该库需要Go 1.16或更高版本。
那么本篇文章将会介绍我们操作Excel的常用功能,如下:
- 生成一个新的Excel文件
- 向Excel文件中追加内容
- 解析Excel文件内容
- 使用Http协议上传并解析Excel文件
- 使用Http协议将数据转换为Excel文件并下载
1 下载依赖库
go get github.com/xuri/excelize # Go Modules使用这个命令 go get github.com/xuri/excelize/v2
2 具体操作
2.1 生成一个新的Excel文件
func WriteNewExcel() { f := excelize.NewFile() // 创建一个sheet index := f.NewSheet("Sheet2") // 根据sheet和坐标 确定一个值 // 例如f.SetCellValue("Sheet2", "A2", "Hello world.")就是在Sheet表中A列第2行的格子里填入Hello world. f.SetCellValue("Sheet2", "A2", "Hello world.") f.SetCellValue("Sheet1", "B1", 100) f.SetCellValue("Sheet1", "B2", 100) // 将新的sheet添加到Excel中 f.SetActiveSheet(index) // 保存Excel if err := f.SaveAs("Book1.xlsx"); err != nil { fmt.Println(err) } }
2.2 向Excel文件中追加内容
func WriteExcel() { f, _ := excelize.OpenFile("Book1.xlsx") index := f.NewSheet("Sheet2") f.SetCellValue("Sheet2", "A2", "Hello world.") f.SetCellValue("Sheet1", "B1", 100) f.SetCellValue("Sheet1", "B2", 100) f.SetActiveSheet(index) if err := f.SaveAs("Book1.xlsx"); err != nil { fmt.Println(err) } }
2.3 解析Excel文件内容
func ReadExcel() { f, err := excelize.OpenFile("Book1.xlsx") if err != nil { fmt.Println(err) return } defer func() { if err := f.Close(); err != nil { fmt.Println(err) } }() // 根据sheet和坐标读取某一个格子的值 cell, err := f.GetCellValue("Sheet1", "B2") if err != nil { fmt.Println(err) return } fmt.Println(cell) // 按行读取全部 rows, err := f.GetRows("Sheet1") if err != nil { fmt.Println(err) return } for _, row := range rows { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } }
2.4 使用Http协议上传并解析Excel文件
func HttpReadExcel() { f := func(read io.Reader) { file, err := excelize.OpenReader(read) if err != nil { fmt.Println(err) return } for _, item := range file.GetSheetList() { rows, _ := file.GetRows(item) // rows是一个二维数组 for i := range rows { strs := rows[i] for j := range strs { str := rows[i][j] fmt.Println(str) } } } } http.HandleFunc("/excel", func(w http.ResponseWriter, r *http.Request) { file, _, err := r.FormFile("file") if err != nil { fmt.Println(err) return } fileBytes, err := ioutil.ReadAll(file) if err != nil { fmt.Println(err) return } reader := bytes.NewReader(fileBytes) f(reader) w.Write([]byte("Hello Http Get!")) }) http.ListenAndServe(":8080", nil) }
2.5 使用Http协议将数据转换为Excel文件并下载
func HttpDownloadExcel() { fun := func(fileName string) *bytes.Reader { f := excelize.NewFile() f.SetCellValue("Sheet1", "B1", 100) err := f.SaveAs(fileName) if err != nil { fmt.Println(err) } var buffer bytes.Buffer _ = f.Write(&buffer) return bytes.NewReader(buffer.Bytes()) } http.HandleFunc("/downloadExcel", func(w http.ResponseWriter, r *http.Request) { reader := fun("Book2.xlsx") // 重新设置文件名称 w.Header().Set("Content-Disposition", "attachment; filename="+"Book2.xlsx") io.Copy(w, reader) }) http.ListenAndServe(":8080", nil) }
3 小总结
以上功能只需灵活扩展后基本上就可以覆盖大部分业务了,但是有一点需要注意,在2.5使用Http协议将数据转换为Excel文件并下载这个操作中,需要将文件进行重命名,这个名称可以自定义,也可以由服务端指定,但是需要以相关文件类型的名称做后缀,否则会输出zip压缩文件,很难看懂。
今天的分享就到这里~