import (
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" "github.com/xuri/excelize/v2"
)
//导出excel func (c *communicationStatisticBlockService) ExportStatistic(ctx context.Context, req *v1.ExportStatisticReq) (res v1.ExportStatisticListApiRes, err error) { //根据时间区间查询数据 var beginYm = "" var endYm = "" //如果未传递时间区间 默认本月 if req.BeginAt == "" || req.EndAt == "" { beginYm = gtime.Now().Format("ym") endYm = gtime.Now().Format("ym") } else { beginYm = gtime.NewFromStr(req.BeginAt).Format("ym") endYm = gtime.NewFromStr(req.EndAt).Format("ym") } var beginTableName = statusDeviceStatisticBaseTableName + "_" + beginYm var endTableName = statusDeviceStatisticBaseTableName + "_" + endYm f := excelize.NewFile() // 创建一个工作表 index := f.NewSheet("Sheet1") //合并单元格 err = f.MergeCell("Sheet1", "A1", "E1") if err != nil { return nil, err } err = f.MergeCell("Sheet1", "A2", "E2") if err != nil { return nil, err } //设置列宽 err = f.SetColWidth("Sheet1", "A", "E", 25) if err != nil { return nil, err } //设置表头内容 err = f.SetCellValue("Sheet1", "A1", "电表数据明细") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "A2", ""+req.BeginAt+"至"+req.EndAt+"") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "A3", "电表编号") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "B3", "起始读数") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "C3", "抄表读数") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "D3", "实际用电量") if err != nil { return nil, err } err = f.SetCellValue("Sheet1", "E3", "所属区域") if err != nil { return nil, err } //获取设备列表 lists := ([]*entity.Device)(nil) devicelist := dao.Device.Ctx(ctx) err = devicelist.Scan(&lists) if err != nil { return nil, err } //遍历设备 for i, v := range lists { curIndex := i + 4 strIndex := strconv.Itoa(curIndex) //设置表内内容 err = f.SetCellValue("Sheet1", "A"+strIndex, v.Name) if err != nil { return nil, err } result, _ := g.DB().GetAll(ctx, "select total_active_energy from "+beginTableName+" where device_sn = "+v.DeviceSn+" and created_at >= "+req.BeginAt+" order by total_active_energy ASC") result2, _ := g.DB().GetAll(ctx, "select total_active_energy from "+endTableName+" where device_sn = "+v.DeviceSn+" and created_at >= "+req.EndAt+" order by total_active_energy DESC") if len(result) > 0 && len(result2) > 0 { first := result[0] //设置起始读数 err = f.SetCellValue("Sheet1", "B"+strIndex, first["total_active_energy"]) if err != nil { return nil, err } last := result2[0] //设置抄表读数 err = f.SetCellValue("Sheet1", "C"+strIndex, last["total_active_energy"]) if err != nil { return nil, err } // //cha := last["total_active_energy"].Float64() - first["total_active_energy"].Float64() //f.SetCellValue("Sheet1", "D"+strIndex, cha) } //设置设备所属范围 result3, _ := g.DB().GetOne(ctx, "select name from meter_group where group_id = ?", v.GroupId) re := result3["name"] err = f.SetCellValue("Sheet1", "E"+strIndex, re) if err != nil { return nil, err } //设置表格样式,垂直水平居中 styleOne, err := f.NewStyle( `{"alignment":{"horizontal":"center","vertical":"center"}}`, ) if err != nil { fmt.Println(err) } // 设置样式范围 err = f.SetCellStyle("Sheet1", "A1", "E"+strIndex, styleOne) if err != nil { return nil, err } //设置表格样式,垂直水平居中,字体加粗 styleTwo, err := f.NewStyle( `{"font":{"bold":true},"alignment":{"horizontal":"center","vertical":"center"}}`, ) if err != nil { fmt.Println(err) } // 设置样式范围 err = f.SetCellStyle("Sheet1", "A1", "E3", styleTwo) if err != nil { return nil, err } } r := ghttp.RequestFromCtx(ctx).Response // 设置工作簿的默认工作表 f.SetActiveSheet(index) //设置表格名 filename := "work.xlsx" // 返回数据到客户端 r = ghttp.RequestFromCtx(ctx).Response r.Header().Add("Content-Type", "application/octet-stream") r.Header().Add("Content-Disposition", "attachment; filename="+filename) r.Header().Add("Content-Transfer-Encoding", "binary") //下载表格 _ = f.Write(r.Writer) return }
导出表格如图