beego文件(xls,xlsx)上传功能。
func (t *LPotentialController) UploadfileAndImport() {
var result gutils.LResultAjax
// //filename := t.GetString("filename")
picdata := t.GetString("picdata")//base64编码
extname := t.GetString("extname") //后缀名字的判断
if extname != "xls" && extname != "xlsx" {
result.Code = 0
result.Info = "文件格式不对!"
t.Data["json"] = result
t.ServeJSON()
return
}
if picdata == "" {
result.Code = 0
result.Info = "picdata不能为空"
t.Data["json"] = result
t.ServeJSON()
return
}
buf, _ := base64.StdEncoding.DecodeString(picdata) //文件写入到buffer
path := utils.GetApplicationFullName()// 得到当前执行的exe的全路径文件名,如果失败返回""
dir := utils.ExtractFileDir(path) + "\\Cache\\"//缓存目录
utils.ForceDirectories(dir)//创建一个新目录
dest := fmt.Sprintf("%d", gutils.CreateGUID()) + ".xls"//生成一个临时服务器存放文件goSnowFlake算法
src := dir + dest
err2 := ioutil.WriteFile(src, buf, 0666) //buffer输出到xls文件中(不做处理,直接写到文件)
if err2 != nil {
result.Code = 0
result.Info = err2.Error()
return
}
//读取里面的数据
//数据切割组合
//数据数据库操作 去重等的判断 删除文件
excelFileName := src
xlFile, err := xlsx.OpenFile(excelFileName)//打开服务器文件
if err != nil {
os.Remove(src) //删除文件
result.Code = 0
result.Info = err.Error()
t.Data["json"] = result
t.ServeJSON()
return
}
var resinfo config.LJSON
for _, sheet := range xlFile.Sheets {//切割
k := 0
for _, row := range sheet.Rows {//列切割
i := 0
item := resinfo.AddItem()
for _, cell := range row.Cells {//行切割
s, _ := cell.String()
if k <= 1 {
} else {
item.Set("cells" + fmt.Sprintf("%d", i)).SetString(s)//单元格数据加入到数组中
}
i = i + 1
}
k = k + 1
}
}
os.Remove(src) //删除文件
res := resinfo
ressulringo, err3 := Importexcel(res,chainid) //这里格式化导入数据
if ressulringo.ItemCount() <= 0 {
result.Code = 0
result.Info = "没有要处理的数据"
t.Data["json"] = result
t.ServeJSON()
}
if err3.Msg != nil { //获取数据有问题提示
result.Code = 0
result.Info = err3.Msg.Error()
result.List = ressulringo.Interface()
t.Data["json"] = result
t.ServeJSON()
} else { //没有问题提交了
ressul := t.CheckJ(ImportSure(ressulringo)) //没有问题确实导入
t.Data["json"] = ressul
t.ServeJSON()
}
}
//参数校验函数
func Importexcel(param config.LJSON, chainid string) (resinfo config.LJSON, err gutils.LError) {
//var resinfo config.LJSON
var comres config.LJSON
var trans *config.LJSON
var x2 config.LJSON
for i := 2; i < param.ItemCount(); i++ {
item := param.Item(i)
clincname := item.Get("cells0").String()
usernum := item.Get("cells1").String()
cusname := item.Get("cells2").String()
cusmobile := item.Get("cells3").String()
remarks := item.Get("cells4").String()
//表格内的数据重复判定 诊所和手机号
for m := 0; m < x2.ItemCount(); m++ {
mitem := x2.Item(m)
// mitem.Get("clincname").String() == clincname &&
if mitem.Get("mobile").String() == cusmobile {
err.Errorf(gutils.ParamError, "第"+fmt.Sprintf("%d", i+1)+"行与第"+fmt.Sprintf("%d", m+3)+"行数据重复")
return
}
}
trans = x2.AddItem()
trans.Set("clincname").SetString(clincname)
trans.Set("mobile").SetString(cusmobile)
//正则表达式
pattern := `1[3|4|5|7|8|][\d]{9}`
reg := regexp.MustCompile(pattern)
str := reg.MatchString(cusmobile)
if str == false {
err.Errorf(gutils.ParamError, "第"+fmt.Sprintf("%d", i+1)+"行手机号码格式错误")
return
}
if clincname == "" || usernum == "" || cusname == "" || cusmobile == "" {
err.Errorf(gutils.ParamError, "第"+fmt.Sprintf("%d", i+1)+"行数据不完整")
return
}
if len(remarks) > 20 {
err.Errorf(gutils.ParamError, "第"+fmt.Sprintf("%d", i+1)+"行备注长度过长")
return
}
item1 := resinfo.AddItem()
item1.Set("clincname").SetString(clincname)
item1.Set("usernum").SetString(usernum)
item1.Set("cusmobile").SetString(cusmobile)
item1.Set("name").SetString(cusname)
item1.Set("remarks").SetString(remarks)
item1.Set("chainid").SetString(chainid) //22525851358728192
comres, err = DoimportBefore(item1, i)
if err.Msg != nil {
err.Errorf(gutils.ParamError, err.Msg.Error())
return
}
item1.Set("clinicid").SetString(comres.Get("clinicid").String())
item1.Set("marketid").SetString(comres.Get("marketid").String())
}
return
}
//导入到数据表
func ImportSure(param config.LJSON) (result gutils.LResultModel, err gutils.LError) {
err.Caption = "ImportSure"
var xt config.LJSON
o := orm.NewOrm()
o.Using("db_koala")
//o.Begin()
//循环添加数据
for i := 0; i < param.ItemCount(); i++ {
//先判断手动添加的
item := param.Item(i)
xt.Set("datastatus").SetInt(0) //激活状态
xt.Set("createtime").SetString(createtime) //更新时间
sql := `insert into t_potential_customer( DataStatus,CreateTime) value(:datastatus,:createtime)`
_, err.Msg = o.RawJSON(sql, xt).ValuesJSON(&result.List)
if err.Msg != nil {
err.Errorf(gutils.ParamError, "导入失败!")
return
}
}
return
}