一个读写excel的简单程序(golang)

最近总有一些临时统计的需求,比如其他团队生产的一批数据,需要确认这批数据是否入到数仓,提供的列表就是一个excel,我们就需要读取excel中的所有数据,之后查询数仓数据库确认这批数据是否存在,并分别将存在的与不存在的再标记出来。

1、读取excel文件

首先准备一个excel,内容如下,大概有100条数据:

下面实现对该文档的读取,读取方式包括一次性全部读取,适合数据量不大的场景,也包括按行读取,适合数据量大的场景:

Go 复制代码
func ExcelRead(name string) {
    f, err := excelize.OpenFile(name)
    if err != nil {
        fmt.Println("open file error:", err)
        return
    }
    defer f.Close()
    // 获取所有sheet的名称
    sheets := f.GetSheetMap()
    for _, name := range sheets {
        // 获取单个sheet的全部内容,正式上线需要考虑内存占用问题
        rows, err := f.GetRows(name)
        if err != nil {
            fmt.Println("get rows error:", err)
            return
        }
        fmt.Println("rows lenth:", len(rows))
        // 每次读取一行,减少内存占用
        for i := 0; i < 200; i++ {
            st, err := f.GetCellValue(name, fmt.Sprintf("A%v", i+2))
            if err != nil {
                fmt.Println("get cell value error:", err)
            }
            if st == "" {
                break
            }
            et, err := f.GetCellValue(name, fmt.Sprintf("B%v", i+2))
            if err != nil {
                fmt.Println("get cell value error:", err)
            }
            sub, err := f.GetCellValue(name, fmt.Sprintf("C%v", i+2))
            if err != nil {
                fmt.Println("get cell value error:", err)
            }
            fmt.Println(st, et, sub)
        }
    }
}

运行记录:

2、写excel文件

写excel,那就把第一步读取的excel重新写入到excel中,并写到两个sheet中,内容为三列(A/B/C):

Go 复制代码
func ExcelWrite(sheet1 [][]string, sheet2 [][]string) {
    col := []string{"A", "B", "C"}
    f := excelize.NewFile()
    defer f.Close()
    // 创建名为车端挖掘数据的工作表
    _, err := f.NewSheet("车端挖掘数据")
    if err != nil {
        fmt.Println("new sheet error:", err)
        return
    }
    // 设置单元格的值。
    f.SetCellValue("车端挖掘数据", "A1", "start_time")
    f.SetCellValue("车端挖掘数据", "B1", "end_time")
    f.SetCellValue("车端挖掘数据", "C1", "subject")
    for i, v := range sheet1 {
        for k, v1 := range v {
            f.SetCellValue("车端挖掘数据", col[k]+fmt.Sprintf("%v", i+2), v1)
        }
    }
    // 创建名为车端挖掘数据的工作表
    sheetName := "云端挖掘数据"
    index, err := f.NewSheet("云端挖掘数据")
    if err != nil {
        fmt.Println("new sheet error:", err)
        return
    }
    // 设置默认sheet,打开表格时,默认显示的sheet
    f.SetActiveSheet(index)
    // 设置单元格的值。
    f.SetCellValue(sheetName, "A1", "start_time")
    f.SetCellValue(sheetName, "B1", "end_time")
    f.SetCellValue(sheetName, "C1", "subject")
    for i, v := range sheet1 {
        for k, v1 := range v {
            f.SetCellValue(sheetName, col[k]+fmt.Sprintf("%v", i+2), v1)
        }
    }
    // 将Excel另存为文件
    if err := f.SaveAs("/Users/liupeng/Downloads/test.xlsx"); err != nil {
        fmt.Println(err)
    }
}

运行结果:

3、在excel中生成柱状图

假设我们有这样一组数据:

我们希望将这组数据写入excel,并生成一个柱状图,类似这样:

代码如下:

Go 复制代码
func CreateChart() {
    f := excelize.NewFile()
    defer f.Close()
    contents := [][]any{
        {nil, "Apple", "Orange", "Pear"},
        {"Small", 2, 3, 3},
        {"Normal", 5, 2, 4},
        {"Large", 6, 7, 8},
    }
    for idx, row := range contents {
        cell, err := excelize.CoordinatesToCellName(1, idx+1)
        if err != nil {
            fmt.Println(err)
            return
        }
        f.SetSheetRow("Sheet1", cell, &row)
    }
    if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
        Type: excelize.Col3DClustered,
        Series: []excelize.ChartSeries{
            {
                Name:       "Sheet1!$A$2",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$2:$D$2",
            },
            {
                Name:       "Sheet1!$A$3",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$3:$D$3",
            },
            {
                Name:       "Sheet1!$A$4",
                Categories: "Sheet1!$B$1:$D$1",
                Values:     "Sheet1!$B$4:$D$4",
            }},
        Title: []excelize.RichTextRun{
            {
                Text: "Fruit Chart",
            },
        },
    }); err != nil {
        fmt.Println(err)
        return
    }
    // Save spreadsheet by the given path.
    if err := f.SaveAs("/Users/liupeng/Downloads/Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

以上就是三个基础的操作excel的方法,希望对大家有用。

欢迎投身技术的小伙伴们关注交流~~~~~~~~~~~~~~~~~~。

往期推荐:

我在百度的这10年~~

云冈石窟:翻开这本距今1565年、与天地同久长的石头史书,感受北魏王朝雕刻艺术的巅峰之作。

一个异步架构设计:批量消费RabbitMQ,批量写入Elasticsearch(golang实现)

历经沧桑的应县木塔,在风雨中已等你969年。

从北京到大同,走过600里,跨越1000年。

命令行参数的艺术:Python、Golang、C++技术实现

supervisor,你理应知道。

跑步的第六年,才真正了解运动的意义

微信小程序文章列表焕新颜:从丑小鸭到白天鹅的华丽蜕变

Elasticsearch高级检索对决:search_after+pit和scroll,谁才是最佳选择?

李白:为何两次选择做了上门女婿?

借助tritonserver完成gpt2模型的本地私有化部署

GRPC开发全攻略:从环境搭建到代码实现

武汉抗疫英雄汪勇:平凡人的非凡之举。

趴菜就是趴菜,捯饬3天,才搞出小程序头部banner,还是个半成品

小程序实现文章列表点击跳转公众号详情页

前端小趴菜终于把公众号和开发的不能再磕碜的小程序首页关联上了

【续】开发triton客户端,访问clip-vit-large-patch14模型抽取图片特征。

NVIDIA tritonserver实现CLIP-ViT模型工程化:轻松获取图片特征(by grpc or http)

一文揭秘:Golang+Elasticsearch轻松搭建AI时代的图片搜索服务

轻松搭建Elasticsearch:Mac系统下的安装指南

Kibana for Mac:极简安装教程

RabbitMQ-死信队列(golang)

项目踩坑记--RabbitMq连接过多导致的内存打满

elasticsearch查询语言DSL构建包使用及实现原理(golang)

纳兰性德-我是人间惆怅客,世间唯有『若』字,最难成真

golang操作mysql之利器-gorm

Elasticsearch写入、读取、更新、删除以及批量操作(golang)

抖音视频批量下载工具

tritonserver学习之六:自定义c++、python custom backend实践

相关推荐
期待のcode37 分钟前
Spring框架1—Spring的IOC核心技术1
java·后端·spring·架构
上官浩仁1 小时前
springboot excel 表格入门与实战
java·spring boot·excel
Livingbody2 小时前
10分钟完成 ERNIE-4.5-21B-A3B-Thinking深度思考模型部署
后端
胡萝卜的兔3 小时前
go 日志的分装和使用 Zap + lumberjack
开发语言·后端·golang
en-route3 小时前
如何在 Spring Boot 中指定不同的配置文件?
java·spring boot·后端
core5124 小时前
Hive实战(一)
数据仓库·hive·hadoop·架构·实战·配置·场景
栀椩4 小时前
springboot配置请求日志
java·spring boot·后端
何似在人间5754 小时前
Go语言快速入门教程(JAVA转go)——1 概述
java·开发语言·golang
Swift社区5 小时前
如何解决 Spring Bean 循环依赖
java·后端·spring
爱吃烤鸡翅的酸菜鱼5 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法