一文搞懂Go读写Excel文件
【摘要】 先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用Excel~GitHub链接:https://github.com/qax-os/excelizeExcelize是一个用纯Go语言编写的库,提供了一组函数,可以对XLAM / XLSM / XLSX / XLTM / XLTX文件进行读写。支持读写由Microsoft Excel™2007及以后版本生成的电子表格文档。通过高兼容性支持...
先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用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压缩文件,很难看懂。
今天的分享就到这里~
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)