在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近要实现一个生成excel的报表服务,具体要实现的报表样子大概如下(暂时忽略样式):
功能描述如上图所示,要实现这样一个报表每一个sheet中按照周去展示,每一周中显示对应的日、周、月、未执行的服务,并且标上执行人,而且对于不同时期的版本要记录不同的sheet 如果对应程序的角度,每个sheet中要循环周数据,每一周中对应的服务要各自循环输出每一个项目,对于单个excel文件要循环输出多个sheet。 循环套循环…,考虑到如果有这样一个模板文件支持特定标识符的内嵌,然后程序可以根据这些标识符输出对应的excel,功能就实现了。
功能实现在github中发现了这样一个repo, github.com/ivahaev/go-xlsx-templater 的go语言实现库
可以看到里边用到了 tealeg/xlsx 和 aymerick/raymod 这两个包,第一个是go语言实现的excel库,第二个是对于template的解析 具体的介绍可以去这两个包对应的repo中了解,这里就不在描述了。
使用方式也很简单 1. 预加载模板 2. 渲染(拷贝) 3. 输出文件 1 doc := xlst.New() 2 doc.ReadTemplate("./template.xlsx") 3 doc.Render(ctx) 4 doc.Save("./report.xlsx") 要实现文中开始描述的报表功能还需要修改package的源码,主要解决的问题是
1 // RenderMultipleSheet 输出多个sheet 2 func (m *Xlst) RenderMultipleSheet(options *Options ,in ...InParam) error { 3 if options == nil { 4 options = new(Options) 5 } 6 report := xlsx.NewFile() 7 //TODO: 模板中只考虑单个sheet 8 for si, sheet := range m.file.Sheets { 9 for idx,item:=range in{ 10 ctx := getCtx(item.In, si) 11 if item.SheetName==""{ 12 report.AddSheet(fmt.Sprintf("Sheet%d",idx)) 13 }else{ 14 _,e:=report.AddSheet(item.SheetName) 15 if e!=nil{ 16 fmt.Errorf("%+v",e) 17 } 18 } 19 l:=len(report.Sheets) 20 fmt.Printf("%d",l) 21 cloneSheet(sheet, report.Sheets[idx]) 22 err := renderRows(report.Sheets[idx], sheet.Rows, ctx, options) 23 if err != nil { 24 return err 25 } 26 27 for _, col := range sheet.Cols { 28 report.Sheets[idx].Cols = append(report.Sheets[idx].Cols, col) 29 } 30 } 31 32 } 33 m.report = report 34 return nil 35 } 1 //xlst 2 // 高度自适应修改 3 //to.SetHeight(from.Height) 打印分隔符的支持,我参考了 360EntSecGroup-Skylar/excelize包的实现(对应 InsertBreakPage),将打印分隔符相关的struct xml字段和方法迁移到了 tealeg/xlsx 库中,东拼西凑的感觉。
1 type Sheet struct { 2 Name string 3 File *File 4 Rows []*Row 5 Cols []*Col 6 MaxRow int 7 MaxCol int 8 Hidden bool 9 Selected bool 10 SheetViews []SheetView 11 SheetFormat SheetFormat 12 AutoFilter *AutoFilter 13 // 加入 分页符 14 RowBreaks *XlsxBreaks 15 ColBreaks *XlsxBreaks 16 }
我的模板文件:
结束语
开源社区有很多优秀的package,可能某个特定的package对自己所需要的功能实现的还不够完整,那就自己尝试着去改吧,这个过程也有助于自己去熟悉go语言。
转载请标明出自:go语言中使用excel template生成报表 |
请发表评论