go一个开源的报表工具标签定义

发布时间:2026/5/26 21:51:17

go一个开源的报表工具标签定义 https://gitee.com/leijmdas/goweb3.git实现了一个基于Gin框架的Excel报表导出功能。主要包含以下内容测试用例Test002_ExportFile用于验证/dept/ExportExcel接口的导出功能UserFuncWeb.ExportFile方法处理导出请求调用业务逻辑并返回结果ReportExcelTable结构体定义了Excel报表的字段映射关系通过excel标签配置表头标题(title)列宽(width)可见性(visible)日期格式(format)等核心功能由ReportTable结构体实现包括解析excel标签配置处理嵌套结构体设置表格样式(对齐方式、字体等)支持分页导出(pageSize)该实现提供了灵活的Excel报表导出功能可通过标签配置自定义导出格式和样式。func (suite *TestWebSuite) Test002_ExportFile() { var testframe testgin.FindBeanGinTestframe().UseDefault() testframe.InitPost(/dept/ExportExcel, uiweb.NewUserController().ExportFile) // testframe.HeaderTokenAccess(token) var req uipage.FindBeanUserRequest() var ret testframe.Post2PageResult(req) golog.Info(ret) }func (self *UserFuncWeb) ExportFile(c *gin.Context) { var req uipage.FindBeanUserRequest() if self.ParseBody(c, req) ! nil { return } var ret req.ExportFile(c) if ret.IsFailed() { golog.Error( ExportFile ret:, ret) c.IndentedJSON(200, ret) } }type ReportExcelTable struct { gotag.ReportTable excel:title:单词报表;pageSize:10000 Word string excel:title:单词;width:20;visible:true Meaning string excel:title:意思;width:20 PartSpeech string excel:title:词性;width:20 Ipa string excel:title:音标;width:20 Total int excel:title:总数;width:20;visible:false Id int64 excel:title:ID;width:20;visible:false UpdatedAt time.Time excel:title:更新时间;width:20;visible:false;format:2006-01-02; CreatedAt time.Time excel:title:创建时间;width:20;visible:false;format:2006年01月02; }func (self *UserRequest) ExportFile(c *gin.Context) *pagemodel.PageResult[*dbentity.TSysUser] { type ReportTable struct { gotag.ReportTable excel:title:用户;pageSize:-1 Id int32 excel:title:主键 Username string excel:title:名称 //Product excel:ifNest:true MobileNo string // 公司邮箱 Email string // 状态(1:启用;0:停用) Status int8 } return self.ExportFile2Ret(c, ReportTable{}) }func (self *UiQueryRequest[P, E]) ParseTable(ireportTable gotag.IreportTable) error { ireportTable.SetTabler(self.Param) var err ireportTable.ParseTable(ireportTable) if ireportTable.GetReportMeta().GetPageSize() 0 { ireportTable.GetReportMeta().SetPageSize(self.PageSize) } return err } func (self *UiQueryRequest[P, E]) ExportFile2Ret(c *gin.Context, ireportTable gotag.IreportTable) *pagemodel.PageResult[E] { if err : self.ParseTable(ireportTable); err ! nil { return self.PageResultError(err) } var ret self.QueryModel2Report(ireportTable.GetPageSize()) if ret.IsFailed() { return ret } var expRet goexcelframe.FindBeanGoexcelFrame().ExportFile2Ret(c, ret.MapDefault().Data, ireportTable) ret.IchubResult *expRet return ret }// Description 报表表格 type ReportTable struct { basedto.BaseEntity // 报表元数据 ReportMeta // 报表列 ReportColumns []*ExportColumn } func NewReportTable() *ReportTable { var i ReportTable{} i.Init() return i } func (self *ReportTable) Init() { } func (self *ReportTable) GetReportMeta() *ReportMeta { return self.ReportMeta } func (self *ReportTable) ParseTable(report IreportTable) error { self.InitProxy(self) err : self.ParseReportMeta(report) var ret self.ParseReport(report) golog.Stat(ReportTable ParseTable , self, ret) return err } func (self *ReportTable) GetExportColumns() []*ExportColumn { return self.ReportColumns } func (self *ReportTable) SetTabler(tabler schema.Tabler) { self.ReportMeta.SetTabler(tabler) } // 扩展 parseExcelTag 函数 func (self *ReportTable) parseExcelTag(tag string) map[string]string { result : make(map[string]string) parts : strings.Split(tag, ;) for _, part : range parts { kv : strings.SplitN(part, :, 2) if len(kv) 2 { key : strings.TrimSpace(kv[0]) value : strings.TrimSpace(kv[1]) result[key] value } } return result } func (self *ReportTable) IsStruTime(t reflect.Type) bool { if t.Kind() reflect.Ptr { t t.Elem() } return t.Kind() reflect.Struct t.PkgPath() time t.Name() Time } func (self *ReportTable) IsStru(t reflect.Type) (reflect.Type, bool) { if t.Kind() reflect.Ptr { t t.Elem() } return t, t.Kind() reflect.Struct } func (self *ReportTable) IsStruNotTime(t reflect.Type) (reflect.Type, bool) { var tt, ok self.IsStru(t) return tt, ok !self.IsStruTime(tt) } // 扩展 ParseReportWordEntity 函数 func (self *ReportTable) ParseReport(report IreportTable) *ReportTable { var table self var t reflect.TypeOf(report) if t.Kind() reflect.Ptr { t t.Elem() } // 解析字段标签 self.ReportColumns make([]*ExportColumn, 0) for i : 0; i t.NumField(); i { field : t.Field(i) reportColumn : self.ParseTag(field, ) if tt, ok : self.IsStruNotTime(field.Type); ok { self.ParseStru(tt, reportColumn) continue } self.ReportColumns append(self.ReportColumns, reportColumn) } return table } func (self *ReportTable) ParseStru(t reflect.Type, col *ExportColumn) *ReportTable { for i : 0; i t.NumField(); i { field : t.Field(i) var tt field.Type if tt.Kind() reflect.Ptr { tt tt.Elem() } if tt.Kind() reflect.Struct !self.IsStruTime(tt) || tt.Kind() reflect.Array || tt.Kind() reflect.Slice { continue } reportColumn : self.ParseTag(field, col.NestColumn()) self.ReportColumns append(self.ReportColumns, reportColumn) } return self } func (self *ReportTable) ParseTag(field reflect.StructField, p string) *ExportColumn { reportColumn : ExportColumn{} reportColumn.Init(field) reportColumn.Column p reportColumn.Column excelTag : field.Tag.Get(excel) if excelTag ! { tags : self.parseExcelTag(excelTag) self.ParseTagSome(tags, reportColumn) self.ParseTagStyle(tags, reportColumn) } return reportColumn } func (self *ReportTable) ParseTagSome(tags map[string]string, reportColumn *ExportColumn) *ExportColumn { if ifNest, ok : tags[ifNest]; ok { reportColumn.IfNest gconv.Bool(ifNest) } // 解析是否自动换行 if wrapText, ok : tags[wrapText]; ok { reportColumn.WrapText gconv.Bool(wrapText) } if title, ok : tags[title]; ok { reportColumn.Title title } if visible, ok : tags[visible]; ok { reportColumn.Visible gconv.Bool(visible) } if ctype, ok : tags[type]; ok { reportColumn.Type ctype } // 解析宽度 if width, ok : tags[width]; ok { reportColumn.Width gconv.Float64(width) } // 解析格式 if format, ok : tags[format]; ok { reportColumn.Format format } return reportColumn } func (self *ReportTable) ParseTagStyle(tags map[string]string, reportColumn *ExportColumn) *ExportColumn { // 解析是否自动换行 if align, ok : tags[align]; ok { reportColumn.Align align } if valign, ok : tags[v]; ok { reportColumn.Valign valign } if fontSize, ok : tags[fontSize]; ok { reportColumn.FontSize gconv.Int32(fontSize) } if bold, ok : tags[bold]; ok { reportColumn.Bold gconv.Bool(bold) } if color, ok : tags[color]; ok { reportColumn.Color color } if family, ok : tags[family]; ok { reportColumn.Family family } return reportColumn }

相关新闻