exexl上传其实就是按照约定execl模板内容读取数据。
问题由来,由于一个一个手动添加数据太过耗费时间。
解决方法:上传execl,上传关键一定要约定execl上传模板,符合execl模板就处理,不符合就不处理。
约定execl上传模板如下:
定义的结构体如下:
//Employee .
type Employee struct {
ID int `json:"id" xorm:"comment(id) id not null pk autoincr INT(11)"`
EmployeeName string `json:"employee_name" xorm:"comment(员工姓名) employee_name not null VARCHAR(32)"`
IdCard string `json:"id_card" xorm:"comment(身份证号码) id_card not null VARCHAR(64)"`
BirthDate string `json:"birth_date" xorm:"comment(出生日期) birth_date not null VARCHAR(128)"`
Sex string `json:"sex" xorm:"comment(性别) sex not null VARCHAR(32)"`
Address string `json:"address" xorm:"comment(地址) address not null VARCHAR(64)"`
TelePhone string `json:"tele_phone" xorm:"comment(手机号码) tele_phone not null VARCHAR(128)"`
CreatedAt time.Time `json:"created_at" xorm:"comment(添加时间) not null created DATETIME"`
CreatedUser string `json:"created_user" xorm:"comment(创建人) created_user not null VARCHAR(128)"`
UpdatedAt time.Time `json:"updated_at" xorm:"comment(更新时间) not null updated DATETIME"`
UpdatedUser string `json:"updated_user" xorm:"comment(更新人) updated_user not null VARCHAR(128)"`
}
获取第三方库
"github.com/360EntSecGroup-Skylar/excelize"
获取上传的execl文件,解析execl的内容为文件流的形式
//AddExcel
// @Summary Excel上传文件中员工
// @Description 由Excel上传文件中员工信息
// @Param file formData file true "Excel文件"
// @Success 200 {object} resp.Result Successfully
// @router /excel [post]
func (e *EmployeeController) AddExcelEmployee() {
logs.Debug("AddExcelEmployee")
var (
err error
file multipart.File
)
//获取execl文件
if file, _, err = e.Ctx.Request.FormFile("file"); err != nil {
logs.Error(err.Error())
e.ErrorResponse(http.StatusBadRequest, resp.CodeFileParamError, err.Error())
return
}
//读excel流
xlsx, err := excelize.OpenReader(file)
if err != nil {
logs.Error("open excel error:[%s]", err.Error())
return
}
//解析excel的数据
if err := employee.ReadExcel(xlsx); err != nil {
err.Log()
err.DefaultCode(resp.CodeAddEmployeeError)
e.ErrorResponse(http.StatusInternalServerError, err.Code, err.Error.Error())
return
}
e.SuccessResponse(http.StatusOK)
}
将获取到的execl的文件流进行解析数据并存放到数据库
//ReadExcel .
func ReadExcel(xlsx *excelize.File) *uerror.Error {
//根据名字获取cells的内容,返回的是一个[][]string
rows := xlsx.GetRows(xlsx.GetSheetName(xlsx.GetActiveSheetIndex()))
//声明一个数组
var datas []db.Employee
for i, row := range rows {
// 去掉第一行是execl表头部分
if i == 0 {
continue
}
var data db.Employee
for k, v := range row {
// 第一列是员工姓名
if k == 0 {
data.EmployeeName = v
}
// 第二列是身份证号码
if k == 1 {
data.IdCard = v
}
// 第三列是出生日期
if k == 2 {
data.BirthDate = v
}
// 第四列是性别
if k == 3 {
data.Sex = v
}
// 第五列是地址
if k == 4 {
data.Address = v
}
// 第六列是电话
if k == 5 {
data.TelePhone = v
}
}
//将数据追加到datas数组中
datas = append(datas, data)
}
//循环遍历datas数组
for _, employee := range datas {
//数组中的元素赋值给结构体
emp := &db.Employee{
EmployeeName: employee.EmployeeName,
IdCard: employee.IdCard,
BirthDate: employee.BirthDate,
Sex: employee.Sex,
Address: employee.Address,
TelePhone: employee.TelePhone,
}
var staff db.Staff
//添加到数据库
if err :=staff.AddEmp(emp);err != nil {
return uerror.New(err)
}
}
return nil
}
将数据添加到数据库
//AddEmp .
func (s *Staff) AddEmp(employee *Employee) error {
if _, err := Engine.Insert(employee); err != nil {
return fmt.Errorf("add employee[%d] failure, error:[%s]", employee.ID, err.Error())
}
return nil
}