当前位置: 首页 > news >正文

golang利用反射写入excel的简单工具类

golang利用反射写入excel的简单工具类

      • 工具类源码
      • 使用方法

工具类源码

package excelimport ("errors""github.com/tealeg/xlsx""os""reflect""strings""zonst/qipai/api/searchscript/infoqueryscript/log"
)func WriteExcel(filePath string, objs interface{}) error {kind := reflect.TypeOf(objs).Kind()if kind != reflect.Slice && kind != reflect.Array {return errors.New("need slice or array")}file := xlsx.NewFile()sheet, err := file.AddSheet("sheet")if err != nil {log.Errorf(err.Error())return err}values := reflect.ValueOf(objs)for i := 0; i < values.Len(); i++ {value := values.Index(i)if value.Kind() == reflect.Ptr {value = value.Elem()}row := sheet.AddRow()if i == 0 {//新增表头valType := value.Type()for j := 0; j < value.NumField(); j++ {row.AddCell().SetValue(valType.Field(j).Tag.Get("excel"))}row = row.Sheet.AddRow()addRowBodyValue(value, row)continue}addRowBodyValue(value, row)}return saveExcel(filePath, file)
}func addRowBodyValue(value reflect.Value, row *xlsx.Row) {for v := 0; v < value.NumField(); v++ {field := value.Field(v)val := objToInterface(field)row.AddCell().SetValue(val)}
}func objToInterface(field reflect.Value) interface{} {switch field.Type().Kind() {case reflect.Int:return field.Int()case reflect.Int32:return field.Int()case reflect.Int64:return field.Int()case reflect.Float32:return field.Float()case reflect.Float64:return field.Float()case reflect.Bool:return field.Bool()case reflect.String:return field.String()default:return field.String()}
}func saveExcel(filePath string, file *xlsx.File) error {//取出文件夹目录if strings.Contains(filePath, "/") {index := strings.LastIndex(filePath, "/")dir := filePath[0:index]err := os.MkdirAll(dir, os.ModePerm)if err != nil {log.Errorf("MkdirAll失败 err:%v", err)return err}}err := file.Save(filePath)if err != nil {log.Errorf("保存excel失败 err:%v", err)return err}return nil
}

使用方法

package mainimport "zonst/qipai/api/searchscript/infoqueryscript/excel"type People struct {Name string `excel:"姓名"`Age  int    `excel:"年龄"`
}func main() {arr := []People{{Name: "张三",Age:  18,},{Name: "李四",Age:  20,},}err := excel.WriteExcel("/Users/zonst/Downloads/用户信息.xlsx", arr)if err != nil {panic(err)}
}

效果图:
在这里插入图片描述


http://www.taodudu.cc/news/show-1476391.html

相关文章:

  • 为pytorch前向和反向的Tensor生成描述性统计
  • 【Qt 学习笔记】Qt常用控件 | 多元素控件 | 多元素控件介绍
  • 机器人非线性系统反馈线性化与解耦
  • 【完善微信证据的证明效力】
  • NSSCTF中的1zjs、作业管理系统、finalrce、websign、简单包含、Http pro max plus
  • 如何获得一个Oracle 23ai数据库(RPM安装)
  • 实习工作难点记录
  • c 结构体之位域(位段)
  • 辗转相除求最大公约数,最大公倍数
  • Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。
  • 错误:cc1: error: unrecognized command line option “-m32”
  • 在编写mini2440 helloworld驱动遇到的问题
  • [leetcode] Median of Two Sorted Arrays 寻找两个有序数组的中位数
  • [leetcode] Reverse Integer 反转一个整数
  • [leetcode] Palindrome Number 回文数判断
  • [leetcode] Longest Common Prefix 字符窜最长公共前缀判断
  • [leetcode] Single Number 查找数组中的单数
  • [leetcode] Power of Two 判断一个数是否是2的平方
  • [leetcode] Max Points on a Line 判断最多有多少个点在同一条直线上
  • 使用selenium webdriver进行元素定位
  • 一个动态增长的栈实现
  • sublime cscope使用方法
  • [leetcode] 24. Swap Nodes in Pairs
  • sublime text常用快捷键整理
  • kmp算法字符串匹配C语言实现
  • VLC设置串流的TTL值
  • [leetcode]328. Odd Even Linked List
  • [leetcode]326. Power of Three(c语言)
  • [leetcode ]221. Maximal Square c语言
  • [leetcode]84. Largest Rectangle in Histogram c语言
  • [leetcode]36. Valid Sudoku c语言
  • python 中 print 函数用法总结
  • python 装饰器粗浅理解
  • ubuntu 15.04安装VMware11
  • ubuntu15.04在安装完vmware11后打开提示 VMware Kernel Module Updater
  • 安装win10和ubuntu双系统启动不了解决