go语言中使用exceltemplate生成报表

go语言中使用exceltemplate生成报表

2023年7月18日发(作者:)

go语⾔中使⽤exceltemplate⽣成报表最近要实现⼀个⽣成excel的报表服务,具体要实现的报表样⼦⼤概如下(暂时忽略样式):

功能描述如上图所⽰,要实现这样⼀个报表每⼀个sheet中按照周去展⽰,每⼀周中显⽰对应的⽇、周、⽉、未执⾏的服务,并且标上执⾏⼈,⽽且对于不同时期的版本要记录不同的sheet如果对应程序的⾓度,每个sheet中要循环周数据,每⼀周中对应的服务要各⾃循环输出每⼀个项⽬,对于单个excel⽂件要循环输出多个sheet。循环套循环…,考虑到如果有这样⼀个模板⽂件⽀持特定标识符的内嵌,然后程序可以根据这些标识符输出对应的excel,功能就实现了。

功能实现在github中发现了这样⼀个repo, /ivahaev/go-xlsx-templater 的go语⾔实现库

Simple .xlsx (Excel XML document) template based document generator using input .xlsx documents with mustache sippets in it and renders new document with snippets replaced by provided to

/tealeg/xlsx and

/aymerick/raymond for useful libs

可以看到⾥边⽤到了 tealeg/xlsx 和 aymerick/raymod 这两个包,第⼀个是go语⾔实现的excel库,第⼆个是对于template的解析具体的介绍可以去这两个包对应的repo中了解,这⾥就不在描述了。

使⽤⽅式也很简单1. 预加载模板2. 渲染(拷贝)3. 输出⽂件1 doc := ()2 mplate("./")3 (ctx) 4 ("./")要实现⽂中开始描述的报表功能还需要修改package的源码,主要解决的问题是当前的代码template包不⽀持⼀个数据集合输出多个sheet,当前⽀持的是按照模板⽂件中的sheet分别渲染。当excel模板中cell设置了⽂字换⾏和⾼度⾃动适应时,输出的excel报表中⽂字会被遮盖。不⽀持打印分隔符 1 // RenderMultipleSheet 输出多个sheet 2 func (m *Xlst) RenderMultipleSheet(options *Options ,in ...InParam) error { 3 if options == nil { 4 options = new(Options) 5 } 6 report := e() 7 //TODO: 模板中只考虑单个sheet 8 for si, sheet := range { 9 for idx,item:=range in{ 10 ctx := getCtx(, si) 11 if ame==""{ 12 et(f("Sheet%d",idx)) 13 }else{ 14 _,e:=et(ame) 15 if e!=nil{ 16 ("%+v",e) 17 } 18 } 19 l:=len() 20 ("%d",l) 21 cloneSheet(sheet, [idx]) 22 err := renderRows([idx], , ctx, options) 23 if err != nil { 24 return err 25 } 26

27 for _, col := range { 28 [idx].Cols = append([idx].Cols, col) 29 } 30 } 31

32 } 33 = report 34 return nil 35 } 1 //xlst 2 // ⾼度⾃适应修改 3 //ght()打印分隔符的⽀持,我参考了 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语⾔。

For what it's worth,It's never too late.

转载请标明出⾃:

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689629541a272169.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信