最近要实现一个生成excel的报表服务,具体要实现的报表样子大概如下(暂时忽略样式):


 

功能描述

如上图所示,要实现这样一个报表每一个sheet中按照周去展示,每一周中显示对应的日、周、月、未执行的服务,并且标上执行人,而且对于不同时期的版本要记录不同的sheet

如果对应程序的角度,每个sheet中要循环周数据,每一周中对应的服务要各自循环输出每一个项目,对于单个excel文件要循环输出多个sheet。

循环套循环…,考虑到如果有这样一个模板文件支持特定标识符的内嵌,然后程序可以根据这些标识符输出对应的excel,功能就实现了。

 

功能实现

在github中发现了这样一个repo, github.com/ivahaev/go-xlsx-templater 的go语言实现库

 

github.com/tealeg/xlsxgithub.com/aymerick/raymond

 

可以看到里边用到了 tealeg/xlsx 和  aymerick/raymod 这两个包,第一个是go语言实现的excel库,第二个是对于template的解析

具体的介绍可以去这两个包对应的repo中了解,这里就不在描述了。

 

使用方式也很简单

1. 预加载模板

2. 渲染(拷贝)

3. 输出文件

要实现文中开始描述的报表功能还需要修改package的源码,主要解决的问题是

  • 当前的代码template包不支持一个数据集合输出多个sheet,当前支持的是按照模板文件中的sheet分别渲染。
  • 当excel模板中cell设置了文字换行和高度自动适应时,输出的excel报表中文字会被遮盖。
  • 不支持打印分隔符

打印分隔符的支持,我参考了 360EntSecGroup-Skylar/excelize包的实现(对应 InsertBreakPage),将打印分隔符相关的struct xml字段和方法迁移到了 tealeg/xlsx 库中,东拼西凑的感觉。

 

 

我的模板文件:

 

结束语

 

开源社区有很多优秀的package,可能某个特定的package对自己所需要的功能实现的还不够完整,那就自己尝试着去改吧,这个过程也有助于自己去熟悉go语言。

 

 

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