实现选中导出为excel文件的基本实现方案是前端将选中的数据传递给后端,后台接受这些数据生成excel文件的流,将流返回给前端并在响应体设置文件的格式。
这时只要将需要下载的数据提交到改接口就会返回文件流数据,提供下载。具体实现代码如下:
- 工具库
https://github.com/douyacun/go-struct-excel
go get github.com/douyacun/go-struct-excel
具体的代码实现参考github示例代码
- 创建导出的结构体
type Company struct {
ID string `json:"id" excel:"主键"`
Creater string `json:"creater" excel:"创建人"`
CreateTime string `json:"create_time" excel:"创建时间"`
Updater string `json:"updater" excel:"更新人"`
UpdateTime string `json:"update_time" excel:"更新时间"`
IsDelete int32 `json:"is_delete" excel:"是否删除"`
Version int32 `json:"version" excel:"版本"`
TenantID string `json:"tenant_id" excel:"多版本唯一标识"`
CreditCode string `json:"credit_code" excel:"企业社会信用代码"`
Name string `json:"name" excel:"企业名称"`
Address string `json:"address" excel:"企业地址"`
Type string `json:"type" excel:"企业类型"`
LegalPersonName string `json:"legal_person_name" excel:"企业法人"`
LegalPersonIDNo string `json:"legal_person_id_no" excel:"企业法人身份证"`
LegalPersonPhoneNo string `json:"legal_person_phone_no" excel:"企业法人电话"`
ContractPersonName string `json:"contract_person_name" excel:"企业联系人姓名"`
ContractPersonIDNo string `json:"contract_person_id_no" excel:"企业联系人身份证"`
ContractPersonPhoneNo string `json:"contract_person_phone_no" excel:"企业联系人联系电话"`
RegisterDate string `json:"register_date" excel:"注册时间"`
Remark string `json:"remark" excel:"备注"`
Lon float64 `json:"lon" excel:"经度"`
Lat float64 `json:"lat" excel:"纬度"`
Geom string `json:"geom" excel:"位置信息"`
ProvinceID string `json:"province_id" excel:"省级编码"`
CityID string `json:"city_id" excel:"市级编码"`
AreaID string `json:"area_id" excel:"区级编码"`
}
json
标签的作用用于结构体来自前端的数据,excel
的标签用户生成excel的表头。
- 生成excel的文件流
// 导出为excel文件流
// T为任意了类型
// data参数为T类型的指针数组,必须是指针数组
// name为导出的问加盟
func Export[T any](data []T, name string, sheetName string) ([]byte, error) {
// helloworld.xlsx
if name == "" {
name = "test.xlsx"
}
if !strings.Contains(name, ".xlsx") {
name = name + ".xlsx"
}
excel := ex.NewExcel(name)
defer excel.File.Close()
sheet, err := excel.AddSheet(sheetName)
if err != nil {
return nil, err
}
if err = sheet.AddData(data); err != nil {
return nil, err
}
return excel.Bytes()
}
这里包装了一下,数据使用指针数组传递,同时传递exel文件名和sheet页数
- 接口返回文件流
// 导出企业库
func ExportCom(c *fiber.Ctx) error {
var req []model.BaseCompanyCopy
if err := c.BodyParser(&req); err != nil {
return http_resp.Fail(c, "参数错误")
}
var data []*excel.Company
for i := 0; i < len(req); i++ {
tmp := utils.StructTimeCopy[model.BaseCompanyCopy, excel.Company](req[i])
data = append(data, &tmp)
}
export, err := excel.Export[*excel.Company](data, "企业信息", "企业信息")
if err != nil {
return http_resp.Fail(c, "导出失败")
}
c.Set("Content-Disposition", "attachment; filename=file"+".xlsx")
return c.Send(export)
}
这里使用fiber的web框架
ctx.Set()
这部很重要,用户设置文件的下载文件的名称。