企業級自定義表單引擎解決方案(十六)--Excel匯入匯出

2022-11-02 18:02:52

  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模板即可。

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 )