本文主要介紹工具,後一篇文章具體講怎麼使用
實戰通用導出excel工具適配多數據源任意表數據-附源碼
1.背景
隨着系統的增加,系統都趨於微服務發展,但是服務之間傳輸當數據過大時也會存在超時現象,比如最常見的功能導入導出,如果同步等待數據量一大勢必會超時,建議解決方案是單獨抽一個服務做成存儲通用服務。
可以通過統一存儲服務連接多個數據源的方式實現導入導出,導入導出服務不影響線上其它業務服務。
但是問題又來了!
雖然新建了存儲服務將業務服務與存儲分離,但如果導大批量的數據數據庫壓力就來了,所以中等數據導數據需要要做成分頁,分批處理,大數據量導出需要預約下載,
思考問題
在開發中會發現,導入功能涉及不同的業務很難統一,但是導出可以,很多功能代碼都是冗餘的,能不能設計一套通用的導出呢 ?
整理一下大概的需求點
- 適合多個平臺公用 ,支持連接導出多個數據源的數據 ;
- 支持分頁導出 ;
- 支持一些參數的基本轉換(枚舉轉換爲文本等),例如時間格式化,小數格式化等 ;
- 支持普通導出列表 ;
- 支持自定義模板導出 ;
- 支持分頁導出,由於往往會導出大批量數據,需要做分頁支持,導出壓縮包,根據配置的頁碼分多個excel形式 ;
2.通用導出設計
要實現的功能一句話概括,
只要是SQL查詢出來導出的只需要配置好相關信息,既可以導出任意數據源下任意表數據,
2.1支持的功能
- 支持多數據源下,任意表數據導出 ;
- 支持配置分頁大小,超出頁碼最大值,則導出一個zip壓縮包,並根據配置的頁碼區分多個excel ;
- 支持普通列表導出 ;
- 支持根據模板導出對象 ;
- 支持導出主單+子單形式的數據 ;
2.2直接上圖
超出最大分頁值,自動導出壓縮包區分多個excel
2.1外部依賴
2.2實現過程
- 需要新增兩張表,一張導出模板表存儲導出配置相關,一張任務表存儲導出任務 ;
- 在導出模板表新建導出模板;(配置導出所需,後邊會講) ;
- 目標系統用戶發起導出 ;
- 目標系統調用存儲服務,存儲服務創建導出任務,並返回任務ID(考慮到查詢頻率與數據庫壓力,任務會加redis緩存) ;
- 存儲服務根據模板配置與目標系統導出參數處理動態SQL,異步導出文件上傳到OSS存儲,並更新任務記錄 ;
- 目標系統主查,或者數據量小情況下可以用前端異步輪訓獲取的方式查詢導出結果 ;
流程圖
3.數據庫相關
3.1.導出模板配置表
用於配置需要導出的表SQL以及標題,字段映射,導出數據源,導出分頁大小等 ;
CREATE TABLE `export_template_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`template_id` varchar(32) NOT NULL COMMENT '模板ID',
`platform_id` varchar(32) NOT NULL COMMENT '平臺方ID',
`db_code` varchar(32) NOT NULL COMMENT '數據庫編碼',
`template_child_id` varchar(32) NOT NULL DEFAULT '0' COMMENT '子模板ID 0-無',
`template_title` varchar(255) NOT NULL DEFAULT '' COMMENT '模板標題',
`template_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '模板狀態 1-啓用; 2-停用',
`template_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '模板類型 1-普通導出列表 ; 2-模板導出列表 ; 3-模板導出對象; 4-模板導出對象與列表',
`table_columns` varchar(2000) NOT NULL COMMENT '表列名(使用 | 分隔)',
`table_names` varchar(1000) NOT NULL DEFAULT '' COMMENT '查詢表名集',
`export_file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '導出文件名',
`export_fields_exp` varchar(2000) NOT NULL DEFAULT '' COMMENT '導出數據字段集(使用 | 分隔)',
`query_condition` varchar(3000) NOT NULL DEFAULT '' COMMENT '查詢條件,支持部分動態標籤',
`order_by_exp` varchar(255) NOT NULL COMMENT '排序條件表達式 示例:a.create_time desc',
`page_size` int(10) NOT NULL DEFAULT '1000' COMMENT '分頁大小',
`download_url_expire` bigint(15) NOT NULL DEFAULT '7200' COMMENT '下載鏈接效期 單位:秒 -1-永久有效',
`template_file_url` varchar(500) NOT NULL DEFAULT '' COMMENT '模板文件下載地址',
`template_file_local_path` varchar(500) NOT NULL DEFAULT '' COMMENT '模板文件本地存儲地址',
`template_refresh_flag` tinyint(4) NOT NULL DEFAULT '1' COMMENT '模板更新標記 1-未更新 ;2-已更新',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_template_id` (`template_id`) USING BTREE,
KEY `idx_platform_id` (`platform_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='導出模板表';
3.2.導出任務表
用於記錄導出任務
CREATE TABLE `export_task_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`task_id` varchar(32) NOT NULL COMMENT '任務ID',
`platform_id` varchar(32) NOT NULL COMMENT '平臺方ID',
`template_id` varchar(32) NOT NULL COMMENT '模板ID',
`task_title` varchar(255) NOT NULL DEFAULT '' COMMENT '任務標題',
`task_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任務狀態 1-處理中 ; 2-處理成功; 3-處理失敗',
`task_param` varchar(2000) NOT NULL DEFAULT '' COMMENT '任務參數(JSON)',
`download_url` varchar(512) NOT NULL DEFAULT '' COMMENT '下載文件URL',
`task_dual` bigint(20) NOT NULL DEFAULT '0' COMMENT '執行耗時毫秒數',
`task_rows` int(11) NOT NULL DEFAULT '0' COMMENT '任務行數',
`ext_info` varchar(512) NOT NULL DEFAULT '' COMMENT '擴展信息',
`remarks` varchar(1024) NOT NULL DEFAULT '' COMMENT '任務備註(失敗原因)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_task_id` (`task_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='導出任務表';
4.模板核心配置
4.1.模板表詳細介紹
字段名稱 | 字段含義 | 備註 | 示例 |
---|---|---|---|
template_id | 模板ID | 模板的唯一ID | |
platform_id | 平臺方ID | 該模板屬於哪個平臺 | |
db_code | 數據庫編碼 | 導出查詢數據庫自定義編碼 | DB001 |
template_child_id | 子模板ID 0-無 | 用於一對多導出主單+子單業務 | 0 |
template_title | 模板標題 | 用戶信息 | |
template_status | 模板狀態 | 1-啓用; 2-停用 | |
template_type | 模板類型 |
1-普通導出列表 ; 2-模板導出列表 ; 3-模板導出對象; 4-模板導出對象與列表 |
|
table_columns | 表列名 | 多個使用 | 分隔,多表,當字段名相同時需自定義別名,支持SQL別名語法 注意:字段名與sql返回的一致 |
table_names | 查詢表名集 | 無需添加關鍵字 “from” 支持關聯表 |
user_info a inner join dept b on a.dept_id=b.dept_id |
export_file_name | 導出文件名 | 用戶信息 | |
export_fields_exp | 導出數據字段集,需要與table_columns配置一致,支持別名(使用 | 分隔) | 未填寫,默認使用table_columns,excel列順序按照 table_columns 已填寫,使用當前內容作爲excel字段,按照當前字段排序, 支持表達式與值的格式轉換 |
query_condition | 查詢條件, | 無需填寫 where關鍵字,支持部分動態標籤,寫法與mybatis xml文件一致 目前支持 if、foreach標籤 |
AND a.user_id = #{userId,jdbcType=VARCHAR} |
order_by_exp | 排序條件表達式 | 無需添加 order by | a.create_time desc |
page_size | 分頁大小 | 導出列表根據此參數分頁 | 100 |
download_url_expire | 下載鏈接效期 | 單位:秒, -1-永久有效 | |
template_file_url | 模板文件下載地址 | ||
template_file_local_path | 模板文件本地存儲地址 | ||
template_refresh_flag | 模板更新標記 | 1-未更新 ;2-已更新 若模板文件在本地存在 該標記爲1則覆蓋更新, 改標記爲2則不更新模板 |
|
4.2導出值格式轉換規則
屬性 | 含義 | 使用說明 | 示例 |
---|---|---|---|
title | 標題 | excel列標題,不填則默認爲字段名 | &title=我是標題 |
replace | 替換 |
使用”_“分隔,原值_替換後,多個逗號分隔 | &replace=1_啓用,2_停用 |
dateFormat | 時間格式化 | 支持時間類型字段格式化,與數字類型yyyyMMdd轉換爲yyyy_MM_dd | &dateFormat=yyyyMMdd 或&dateFormat=yyyyMMdd_yyyy-MM-dd |
prefix | 前綴 | &prefix=我是前綴 | |
suffix | 後綴 | &suffix=% | |
numFormat | 數字格式化 | 使用”_“分隔,規則_數值,多個規則逗號分隔 乘以2 示例 : multiply_2 除以2 示例 : divide_2 保留2位小數 示例 : format_2 |
&numFormat=multiply_2,format_2 |
5.excel模板導出規則
6.實現願景
- 減少重複勞動
7.缺點
- 不支持通過代碼程序拼裝數據的導出方式,只能使用SQL查詢導出 ;
8.附言
萬物有痕,望大佬多多指點