Excel對於後端管理系統來說,永遠都是繞不開的話題,開發Excel匯入匯出功能往往都比較麻煩,因為涉及到Excel匯入模板製作、Excel表格資料與系統資料庫表欄位對映、Excel匯入資料驗證、驗證錯誤資料返回給使用者的互動、表格資料唯一判斷(不存在新增,存在則修改),複雜一些的還會涉及到多表頭、合併單元格情況,可能還會涉及到Excel關聯多張資料表的情況。
對於關聯多張表的情況,處理這種Excel對映出來的資料必須手動碼程式碼處理,這個是沒辦法的,但是對於其他常規匯入匯出以及常規的Excel操作,完全可以進行結構化的封裝處理,理想的情況下可以做到零程式碼實現。
我這裡採用的是NOPI來實現的。
這裡是根據表單模板自動生成的Excel匯入匯出功能,可以開源網站地址檢視。
每個欄位對應Excel裡面的一列,可以定義欄位名稱、列名稱、欄位型別、是否必填、列表頭備註資訊、匯入驗證型別等關鍵資訊,定義好資訊之後,匯入匯出所有邏輯都是圍繞著這個模板來進行的,把所有邏輯封裝到一個元件中,那麼程式碼只需要處理常規的集合物件即可。
public class ExcelTemplate { /// <summary> /// 欄位名稱 /// </summary> public string Field { get; set; } /// <summary> /// 列稱 /// </summary> public string Name { get; set; } /// <summary> /// 欄位型別 /// </summary> public EFieldType FieldType { get; set; } /// <summary> /// 列寬(顯示多少個字元) /// </summary> public int CellLength { get; set; } /// <summary> /// 匯出模版備註 /// </summary> public string ExportComments { get; set; } /// <summary> /// 匯入 是否必填 /// </summary> public bool IsRequred { get; set; } /// <summary> /// 匯入 驗證型別 /// </summary> public EValidateType ValidateType { get; set; } /// <summary> /// 匯入 驗證型別為String時,驗證長度,為Regular,為正規表示式 /// </summary> public string ValidateValue { get; set; } /// <summary> /// All = 1,OnlyForExport = 2(只在匯入匯出Excel使用),OnlyForImport = 3(只在匯入匯入Excel使用) /// </summary> public ETemplateForUse? TemplateForUse { get; set; } }
設定範例:
"excelTemplate": [ { "name": "字元", "field": "stringField", "fieldType": 5, "isRequred": true, "validateType": 0 }, { "name": "日期欄位", "field": "dateTimeField", "fieldType": 7, "validateType": 10 }, { "name": "字典欄位", "field": "dictField", "fieldType": 5, "validateType": 11 }, { "name": "數位", "field": "intField", "fieldType": 1, "validateType": 1 }, { "name": "長字元", "field": "textField", "fieldType": 5, "validateType": 0 }, { "name": "編號", "field": "autoNoField", "fieldType": 5, "templateForUse": 2, "validateType": 0 }, { "name": "浮點欄位", "field": "decimalField", "fieldType": 2, "validateType": 3 }, { "name": "日期欄位2", "field": "dateField", "fieldType": 6, "validateType": 9 } ]
在模板中可以定義欄位的約束資訊,比如欄位型別、長度、驗證表示式等,在匯入的時候,元件自動驗證對應欄位是否滿足約束。
對於一些業務,常規驗證不能滿足情況時,元件可以允許使用者傳入驗證委託函數,自定義驗證邏輯。
匯入Excel出錯時,元件輸出一個錯誤Excel,包括匯入統計資訊,匯入出錯行的原始資料,出錯的行號,出錯行的具體出錯資訊,如:
可根據Excel模板設定資訊,生成匯入資料所需的模板,不需要每一個業務單獨事先生成匯入需要的靜態Excel模板資訊。
自定義表單肯定是要做到零程式碼的,那麼這個就比較簡單了,在模板生成表單設定時,根據物件資訊(物件資訊裡面有欄位名稱、顯示名稱、欄位型別等資訊),讀取特定的欄位構造Excel模板即可。
Excel元件的封裝已經在原始碼中,程式碼就不貼了,可以根據需要應用到自己的系統中,也可以根據需求進行修改、比如匯入某行出錯其他資料是匯入還是不處理等。
wike檔案地址:https://gitee.com/kuangqifu/sprite/wikis/pages
後端開源地址:https://gitee.com/kuangqifu/sprite
前端開源地址:https://gitee.com/kuangqifu/spritefronts
體驗地址:http://47.108.141.193:8031 (首次載入可能有點慢,用的阿里雲最差的伺服器)
自定義表單文章地址:https://www.cnblogs.com/spritekuang/
流程引擎文章地址:https://www.cnblogs.com/spritekuang/category/834975.html (採用WWF開發,已過時,已改用Elsa實現,https://www.cnblogs.com/spritekuang/p/14970992.html )