簡介
report-man:一個(gè)輕量級(jí)的報(bào)表自動(dòng)化工具
對于中小型企業(yè)系統(tǒng)腰涧,一般沒有配套的報(bào)表與經(jīng)分系統(tǒng)進(jìn)行支撐,但運(yùn)維過程中經(jīng)常會(huì)有各種報(bào)表的需求歇竟,報(bào)表一般為Excel格式,且內(nèi)容經(jīng)常發(fā)生變化扩所,需要一套簡單靈活的解決方案虎锚。
REPORT-MAN的程序本體只有一個(gè)可執(zhí)行jar包硫痰,直接使用Excel模板進(jìn)行配置,可以自動(dòng)生成報(bào)表并發(fā)送郵件窜护。支持3種啟動(dòng)方式效斑,簡單易用。
功能特性
- 支持桌面/命令行/WEB應(yīng)用3種運(yùn)行模式
- 無配置文件柱徙,在Excel模板中配置全部參數(shù)
- 可以在模版中定義各種復(fù)雜的匯總缓屠、公式、圖表等
- 以任務(wù)為基本單位护侮,配置靈活敌完,支撐不斷變化的需求
- 支持連接多個(gè)數(shù)據(jù)源
- 支持郵除發(fā)送,可使用代理服務(wù)器
- 豐富的自定義參數(shù)
技術(shù)特性
- Java實(shí)現(xiàn)羊初,基于SpringBoot
- 使用Gradle構(gòu)建
- 使用ApachePOI-XSSF處理Excel2007文件
- 使用JavaMailSender發(fā)送郵件
- 支持使用SOCKS5代理服務(wù)器
- 全部參數(shù)使用Excel配置
- 使用JdbcTemplate滨溉,動(dòng)態(tài)生成數(shù)據(jù)源
- 支持查詢/更新/刪除及建表、建索引等操作
- 跨平臺(tái)长赞,多種運(yùn)行模式
- 對外提供REST接口晦攒,可以配合其它系統(tǒng)使用
使用簡介
report-man針對不同的使用場景,提供了3種啟動(dòng)模式
桌面模式
桌面環(huán)境下使用得哆,提供一個(gè)Swing界面脯颜,用于手工生成報(bào)表。
界面中可以選擇模板路徑贩据、報(bào)表輸出路徑栋操,點(diǎn)擊按鈕直接運(yùn)行即可。
桌面模式饱亮,一般用于對SQL語句進(jìn)行微調(diào)后(例如修改起止時(shí)間)矾芙,手工執(zhí)行生成報(bào)表的場景。
命令行模式
服務(wù)器環(huán)境下近尚,提供了一個(gè)命令行模式蠕啄,用于后臺(tái)靜默執(zhí)行。
一般會(huì)配合crontab定時(shí)生成報(bào)表并發(fā)送郵件戈锻。
crontab示例:
每天23:40執(zhí)行
40 23 * * * cd /foo/bar && ./reportman.sh 模版名稱
每周三23:45執(zhí)行
45 23 * * 3 cd /foo/bar && ./reportman.sh 模版名稱
WEB模式
WEB模式對外提供了一個(gè)開放的REST接口歼跟。可以在其它系統(tǒng)中開發(fā)一個(gè)簡單的界面格遭,調(diào)用report-man的REST接口哈街,生成報(bào)表并發(fā)送郵件。
應(yīng)用默認(rèn)端口為19090拒迅,內(nèi)嵌一個(gè)Swagger-UI界面可以方便的進(jìn)行測試骚秦。
示例參數(shù):
{
"file.prefix": "demo",
"mail.to.list": "foo@bar.com",
"sql.start_date": "2017-10-1",
"sql.end_date": "2017-10-31"
}
成功響應(yīng):
{
"code": "0000",
"message": "報(bào)表生成中她倘,稍后會(huì)發(fā)送至您的郵箱。請不要重復(fù)點(diǎn)擊生成報(bào)表作箍。"
}
說明
- file.prefix為必填硬梁,指定了基礎(chǔ)的模板名稱
- 其它參數(shù)可以靈活添加。會(huì)追加在Sheet2的參數(shù)配置中胞得。如果參數(shù)名稱相同荧止,則會(huì)覆蓋Sheet2中的參數(shù)。
- 接口是異步的阶剑,調(diào)用后會(huì)立即返回成功消息跃巡。如果SQL較復(fù)雜,可能會(huì)后臺(tái)運(yùn)行一段時(shí)間牧愁。
啟動(dòng)腳本
為了方便使用素邪,report-man提供了兩個(gè)啟動(dòng)腳本
Windows環(huán)境 啟動(dòng)腳本
Windows環(huán)境下,只提供了一個(gè)桌面版本的啟動(dòng)入口猪半,直接點(diǎn)擊reportman.cmd
即可兔朦。
./reportman.cmd
Linux/macOS環(huán)境 啟動(dòng)腳本
Linux以及macOS下,提供了一個(gè)全功能的啟動(dòng)腳本磨确,可以支持3種啟動(dòng)方式烘绽。
直接輸入./reportman.sh
可以查看幫助信息
以下為示例:
./reportman.sh gui #啟動(dòng)桌面版本
./reportman.sh cli demo #啟動(dòng)命令行版本,其中demo為模版名稱
./reportman.sh web start #啟動(dòng)WEB版本
./reportman.sh web stop #停止WEB版本
運(yùn)行流程
程序啟動(dòng)后俐填,會(huì)首先載入模板文件,根據(jù)模版中提前定義好的各種參數(shù)翔忽,連接數(shù)據(jù)庫讀取結(jié)果集英融,并將結(jié)果填充到模板的指定區(qū)域。最終生成完整的Excel報(bào)表歇式,并發(fā)送郵件驶悟。
步驟 | 解釋 |
---|---|
1 | 載入模板文件 |
2 | 讀取Sheet1的任務(wù)配置 |
3 | 讀取Sheet2的參數(shù)配置 |
4 | 循環(huán)執(zhí)行全部任務(wù) |
5 | 刪除前2個(gè)配置Sheet頁 |
6 | 刷新Excel公式 |
7 | 保存Excel |
8 | 發(fā)送郵件 |
配置詳解
模板中的前2個(gè)Sheet頁為配置專用。
Sheet1任務(wù)配置材失,用于定義需要執(zhí)行SQL語句痕鳍,對應(yīng)的數(shù)據(jù)源,以及結(jié)果集顯示的區(qū)域等龙巨。
Sheet2參數(shù)配置笼呆,用于定義各種參數(shù),如郵件收件人旨别、代理服務(wù)器诗赌、數(shù)據(jù)源的用戶名密碼等。
從第3個(gè)Sheet頁開始是內(nèi)容頁面秸弛,可以有多個(gè)Sheet頁铭若,需要提前定義好表頭洪碳、樣式、匯總函數(shù)叼屠、圖表等瞳腌。將需要填充內(nèi)容的區(qū)域留空。
Sheet1-任務(wù)配置
任務(wù)配置镜雨,存放于Sheet1中
表樣截圖
字段解釋
名稱 | 解釋 |
---|---|
任務(wù)名稱 | 任務(wù)的中文說明 |
生效標(biāo)識(shí) | Y-生效/N-失效嫂侍。 |
數(shù)據(jù)源 | 數(shù)據(jù)源名稱。數(shù)據(jù)源的詳細(xì)參數(shù)需要在Sheet2中配置冷离。 |
SQL | 查詢SQL語句吵冒。 |
SHEET頁 | 結(jié)果集顯示的Sheet頁。因?yàn)榍皟身撌桥渲脤S梦靼詳?shù)值需要從3開始痹栖。 |
橫向坐標(biāo) | 結(jié)果集起始的橫向X軸坐標(biāo)。數(shù)值從1開始瞭空。 |
縱向坐標(biāo) | 結(jié)果集起始的縱向Y軸坐標(biāo)揪阿。數(shù)值從1開始。 |
單元格樣式 | LEFT-左對齊/CENTER-居中對齊 |
配置示例
任務(wù)名稱 | 生效標(biāo)識(shí) | 數(shù)據(jù)源 | SQL | SHEET頁 | 橫向坐標(biāo) | 縱向坐標(biāo) | 單元格樣式 |
---|---|---|---|---|---|---|---|
預(yù)計(jì)使用人數(shù) | N | mobsale | select foo from bar | 3 | 3 | 3 | CENTER |
累計(jì)登錄次數(shù) | N | mobsale | select foo from bar | 3 | 5 | 3 | CENTER |
累計(jì)登錄人數(shù) | N | mobsale | select foo from bar | 3 | 6 | 3 | CENTER |
本日登錄次數(shù) | Y | mobsale | select foo from bar | 3 | 7 | 3 | CENTER |
本日登錄人數(shù) | N | mobsale | select foo from bar | 3 | 8 | 3 | CENTER |
使用清單 | N | mobsale | select foo from bar | 4 | 1 | 2 | LEFT |
工號(hào)使用情況 | N | mobsale | select foo from bar | 5 | 1 | 2 | LEFT |
說明
- spider-man會(huì)讀取所有"生效標(biāo)識(shí)"為Y的任務(wù)咆畏,并依次執(zhí)行
- 對于select語句南捂,執(zhí)行后會(huì)生成一個(gè)x行y列的結(jié)果集
- 結(jié)果集會(huì)寫入Excel的特定的Sheet頁的特定區(qū)域,具體可以配置"SHEET頁"旧找、"橫向坐標(biāo)"溺健、"縱向坐標(biāo)"3個(gè)參數(shù)
- 單元格樣式可以配置成"LEFT"(左對齊)或"CENTER"(居中對齊)
- 支持update/insert/create table/create index等語句,一般用于生成中間表钮蛛。此類語句不需要指定Sheet頁及坐標(biāo)鞭缭。
- SQL語句中可以插入?yún)?shù)占位符,格式為
${param_name}
魏颓。參數(shù)的值可以在Sheet2中定義岭辣。
Sheet2-郵箱配置
郵箱配置,存放于Sheet2中
表樣截圖
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
郵件-發(fā)送開關(guān) | mail.enable | Y |
郵件-收件人 | mail.to.list | foo@bar.com |
郵件-抄送人 | mail.cc.list | yourname@qq.com |
郵件-標(biāo)題 | mail.subject | XXX系統(tǒng)業(yè)務(wù)日報(bào)表 |
郵件-附件名 | mail.attachment | 業(yè)務(wù)報(bào)表 |
郵件-正文 | mail.message | 您好: |
郵件-服務(wù)器IP | mail.smtp.host | smtp.qq.com |
郵件-服務(wù)器端口 | mail.smtp.port | 465 |
郵件-用戶名 | mail.sender.username | yourname@qq.com |
郵件-密碼 | mail.sender.password | blablablablabla |
郵件-發(fā)件人 | mail.from | yourname@qq.com |
郵件-代理服務(wù)器開關(guān) | mail.proxy.enable | Y |
郵件-代理服務(wù)器IP | mail.proxy.host | 127.0.0.1 |
郵件-代理服務(wù)器端口 | mail.proxy.port | 1080 |
配置示例
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
郵件-發(fā)送開關(guān) | mail.enable | Y |
郵件-收件人 | mail.to.list | foo@bar.com |
郵件-抄送人 | mail.cc.list | yourname@qq.com |
郵件-標(biāo)題 | mail.subject | XXX系統(tǒng)業(yè)務(wù)日報(bào)表 |
郵件-附件名 | mail.attachment | 業(yè)務(wù)報(bào)表 |
郵件-正文 | mail.message | 您好: |
郵件-服務(wù)器IP | mail.smtp.host | smtp.qq.com |
郵件-服務(wù)器端口 | mail.smtp.port | 465 |
郵件-用戶名 | mail.sender.username | yourname@qq.com |
郵件-密碼 | mail.sender.password | blablablablabla |
郵件-發(fā)件人 | mail.from | yourname@qq.com |
郵件-代理服務(wù)器開關(guān) | mail.proxy.enable | Y |
郵件-代理服務(wù)器IP | mail.proxy.host | 127.0.0.1 |
郵件-代理服務(wù)器端口 | mail.proxy.port | 1080 |
說明
- 注意鍵的命名
mail.xxx
是固定的甸饱,請不要隨意增刪沦童。 - 代理服務(wù)器類型必須為SOCKS4/5
- 附件名稱如果為中文,最好不要超過4個(gè)漢字
Sheet2-數(shù)據(jù)源配置
數(shù)據(jù)源配置叹话,存放于Sheet2中
MySQL數(shù)據(jù)源示例
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
數(shù)據(jù)源類型 | db.testdb.driver | com.mysql.jdbc.Driver |
數(shù)據(jù)源地址 | db.testdb.url | jdbc:mysql://127.0.0.1:3306/dbname |
數(shù)據(jù)源用戶名 | db.testdb.username | yourname |
數(shù)據(jù)源密碼 | db.testdb.password | yourpass |
Oracle數(shù)據(jù)源示例
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
數(shù)據(jù)源類型 | db.testdb.driver | oracle.jdbc.driver.OracleDriver |
數(shù)據(jù)源地址 | db.testdb.url | jdbc:oracle:thin:@127.0.0.1:1521:sid |
數(shù)據(jù)源用戶名 | db.testdb.username | yourname |
數(shù)據(jù)源密碼 | db.testdb.password | yourpass |
說明
- 鍵的格式為:
db.xxx.yyy
偷遗。xxx是自定義的數(shù)據(jù)源名稱。yyy是固定的渣刷,不要隨意修改鹦肿。
Sheet2-SQL參數(shù)配置
SQL參數(shù)配置,存放于Sheet2中
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
SQL參數(shù) | sql.start_date | 2010-1-1 |
SQL參數(shù) | sql.end_date | 2012-1-1 |
配置示例
參數(shù)名稱 | 鍵 | 值 |
---|---|---|
SQL參數(shù) | sql.start_date | 2010-1-1 |
SQL參數(shù) | sql.end_date | 2012-1-1 |
說明
- SQL參數(shù)的格式為
sql.xxx
辅柴,其中xxx
為參數(shù)名箩溃。 - SQL參數(shù)的值瞭吃,會(huì)替換Sheet1中SQL語句中的占位符,從而拼成完整的的SQL語句涣旨。
- 例如:
sql.end_date = 2012-1-1
這一行配置歪架,會(huì)將Sheet1中SQL語句里的${end_date}
這個(gè)占位符替換為2012-1-1
Sheet3~SheetN 模版配置詳解
表樣截圖
模版配置非常靈活,可以根據(jù)需求配置多個(gè)Sheet頁霹陡。
模版Sheet頁中中主要是預(yù)先定義好表頭和蚪、顏色、Excel公式等烹棉。數(shù)據(jù)部分留空攒霹,等待程序運(yùn)行后填入。
一般而言浆洗,可以分為詳單頁催束、匯總頁、函數(shù)頁這3類伏社。
詳單頁
展示一個(gè)詳單抠刺,行數(shù)不確定。
只需要定義好一個(gè)表頭即可摘昌,從每二行開始速妖,都是自動(dòng)填充的詳單數(shù)據(jù)。
匯總頁
行數(shù)聪黎、列數(shù)是固定的罕容,用于展示SUM出來的匯總數(shù)據(jù)。
匯總頁的提取稿饰,如果SQL比較復(fù)雜杀赢,可以分開配置多個(gè)任務(wù),每個(gè)任務(wù)只填充特定的一列數(shù)據(jù)湘纵。
函數(shù)頁
與匯總頁類似,但本身并沒有填充數(shù)據(jù)滤淳,而是填接使用Excel函數(shù)梧喷,獲取其它Sheet頁的原始數(shù)據(jù),并進(jìn)行加工與展示脖咐。
注意铺敌,如果報(bào)表中存在SUMPRODUCT函數(shù),POI正常情況下不會(huì)計(jì)算最終結(jié)果屁擅,需要打開Excel后手工執(zhí)行
Ctrl+Alt+F9
進(jìn)行刷新偿凭。
但可以在函數(shù)后面加入+(NOW()*0)
參數(shù),強(qiáng)制POI計(jì)算結(jié)果。
例如:=SUMPRODUCT(('業(yè)務(wù)發(fā)展-按個(gè)人'!$A$2:A$9999=O4)*('業(yè)務(wù)發(fā)展-按個(gè)人'!$B$2:B$9999="營維經(jīng)理")*'業(yè)務(wù)發(fā)展-按個(gè)人'!H$2:H$9999)+(NOW()*0)
服務(wù)器部署
- 運(yùn)行環(huán)境要求:JRE版本1.7及以上派歌。
- 在本機(jī)執(zhí)行
gradle build
構(gòu)建項(xiàng)目弯囊,將生成的build/libs/report-man-1.0.jar
上傳至服務(wù)器痰哨。 - 在jar包所在路徑下新建template及report兩個(gè)目錄。其中template中存放模板匾嘱,report目錄用于存放生成的報(bào)表斤斧。
- 可以使用
crontab -e
配置定時(shí)執(zhí)行