通用導出Excel任意表數據工具

本文主要介紹工具,後一篇文章具體講怎麼使用
實戰通用導出excel工具適配多數據源任意表數據-附源碼

1.背景

隨着系統的增加,系統都趨於微服務發展,但是服務之間傳輸當數據過大時也會存在超時現象,比如最常見的功能導入導出,如果同步等待數據量一大勢必會超時,建議解決方案是單獨抽一個服務做成存儲通用服務。
可以通過統一存儲服務連接多個數據源的方式實現導入導出,導入導出服務不影響線上其它業務服務。
但是問題又來了!
雖然新建了存儲服務將業務服務與存儲分離,但如果導大批量的數據數據庫壓力就來了,所以中等數據導數據需要要做成分頁,分批處理,大數據量導出需要預約下載,

思考問題

在開發中會發現,導入功能涉及不同的業務很難統一,但是導出可以,很多功能代碼都是冗餘的,能不能設計一套通用的導出呢 ?
整理一下大概的需求點

  • 適合多個平臺公用 ,支持連接導出多個數據源的數據 ;
  • 支持分頁導出 ;
  • 支持一些參數的基本轉換(枚舉轉換爲文本等),例如時間格式化,小數格式化等 ;
  • 支持普通導出列表 ;
  • 支持自定義模板導出 ;
  • 支持分頁導出,由於往往會導出大批量數據,需要做分頁支持,導出壓縮包,根據配置的頁碼分多個excel形式 ;

2.通用導出設計

要實現的功能一句話概括,
只要是SQL查詢出來導出的只需要配置好相關信息,既可以導出任意數據源下任意表數據,

2.1支持的功能

  • 支持多數據源下,任意表數據導出 ;
  • 支持配置分頁大小,超出頁碼最大值,則導出一個zip壓縮包,並根據配置的頁碼區分多個excel ;
  • 支持普通列表導出 ;
  • 支持根據模板導出對象 ;
  • 支持導出主單+子單形式的數據 ;

2.2直接上圖

image.png

image.png

超出最大分頁值,自動導出壓縮包區分多個excel
image.png

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.附言

萬物有痕,望大佬多多指點

發佈了60 篇原創文章 · 獲贊 32 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章