最近总有一些临时统计的需求,比如其他团队生产的一批数据,需要确认这批数据是否入到数仓,提供的列表就是一个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的方法,希望对大家有用。
欢迎投身技术的小伙伴们关注交流~~~~~~~~~~~~~~~~~~。
往期推荐:
云冈石窟:翻开这本距今1565年、与天地同久长的石头史书,感受北魏王朝雕刻艺术的巅峰之作。
一个异步架构设计:批量消费RabbitMQ,批量写入Elasticsearch(golang实现)
命令行参数的艺术:Python、Golang、C++技术实现
Elasticsearch高级检索对决:search_after+pit和scroll,谁才是最佳选择?
借助tritonserver完成gpt2模型的本地私有化部署
趴菜就是趴菜,捯饬3天,才搞出小程序头部banner,还是个半成品
前端小趴菜终于把公众号和开发的不能再磕碜的小程序首页关联上了
【续】开发triton客户端,访问clip-vit-large-patch14模型抽取图片特征。
NVIDIA tritonserver实现CLIP-ViT模型工程化:轻松获取图片特征(by grpc or http)
一文揭秘:Golang+Elasticsearch轻松搭建AI时代的图片搜索服务
elasticsearch查询语言DSL构建包使用及实现原理(golang)