最近老师让统计各部门的人员请假数据,想要找到请假次数的同学,钉钉本身是开放这门功能的,但是去具体使用的时候,发现钉钉出了bug,按照部门进行筛选的时候,筛选出来的数据是错误的,已经给钉钉官方反馈,但是官方回复答非所问。既然按照部门筛选有问题,那我就按照时间筛选了一下,从开学九月一号到十一月一号进行筛选,然后把所有人的请假结果都筛选出来了,然后导出到Execl文件,使用Golang语言进行筛选。
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
"sort"
)
func ReadExcel(filename string) {
f, err := excelize.OpenFile(filename)
if err != nil {
fmt.Println("读取excel文件出错", err.Error())
return
}
sheets := f.GetSheetMap() //获取Execl表的工作表
fmt.Println(sheets)
sheet1 := sheets[1] //sheets是一个map,map[1]就是获取到第一个工作表
fmt.Println("第一个工作表", sheet1)
rows := f.GetRows(sheet1) //获取工作表的所有数据,数据存储在一个二维数组中,二维数组中的每一个一位数组就是一行数据
rows2 := f.GetRows(sheets[2])
for i := 0; i < len(rows2); i++ { //把两个工作表的数据加在一起
rows = append(rows, rows2[i])
}
//写一个set,去重,把所有的部门存进去
//Golang中的map就是Java中的HashMap,Golang中没有提供Set,我们可以自己实现一个
//Golang声明一个HashSet,然后HashSet的键再存储到切片中就是一个set
var departmentHashSet = make(map[interface{}]struct{})
void := struct{}{}
for _, row := range rows {
departmentHashSet[row[10]] = void
}
res := map[string]int{}
departments := []string{}
for key, _ := range departmentHashSet {
value, _ := key.(string)
departments = append(departments, value)
}
//以每个人的名字为单位,统计请假次数,我们需要一个map
for j := 0; j < len(rows); j++ {
res[rows[j][9]]++
}
//然后对map排序,根据map的值进行排序
type kv struct {
Key string
Value int
}
var ss []kv
for k, v := range res {
ss = append(ss, kv{k, v})
}
sort.Slice(ss, func(i, j int) bool {
return ss[i].Value > ss[j].Value // 降序
//return ss[i].Value < ss[j].Value // 升序
})
for _, value := range ss {
fmt.Println(value)
}
}
func main() {
ReadExcel("C:\\Users\\lenovo\\Downloads\\20221104084200024.xlsx")
}
Execl的表结构如下
最终筛选结果如下