일반 확장 가능한 Excel 가져오기 구현(Demo 포함)

17741 단어 Excel
데모 소스
배경.
프로그램을 통해 excel을 데이터베이스에 가져오는 것은 매우 흔히 볼 수 있는 기능이다.일반적인 방법은 excel을 DataTable로 바꾸고 DataTable를List로 변환한 다음List를 통해 데이터베이스에 가져오는 것입니다.
또한 일반적인 ExcelUtil 기본 클래스는 List GetEntityListFromFile(string fileName)와 유사한 구현을 제공하지만 이러한 구현은 일반적으로 기계적으로 대응하고 사용자 정의 작업이 부족하다.
문제.
내가 개발하는 과정에서 excel 블록을 가져오는 데 다음과 같은 몇 가지 문제에 부딪혔다.
  • excel의 열 이름은 한 개가 아닐 수 있습니다. (고객이 템플릿을 다운로드하지 않았거나 템플릿의 버전이 잘못되어 같은 열에 여러 개의 열 이름이 있을 수 있습니다. 예를 들어 [ID]와 [번호]는 모두 실체류의 [ID] 열에 대응할 수 있습니다.)
  • excel의 열은 실체 클래스의 여러 열에 대응할 수 있다. (예를 들어 실체 클래스에는 [ID], [Name] 두 필드가 있고 excel 템플릿에는 [ID]만 있을 수 있다. 우리는 excel의 [ID]를 통해 데이터베이스에서 Name 값을 찾아 실체 클래스를 채우는 [Name]을 찾아야 한다.
  • excel에서 일부 데이터의 유효성에 대한 검증이 필요하다. 이는'데이터 형식이 유효하다','데이터가 데이터베이스에 존재한다','데이터가 데이터베이스에 있는 상태가 유효하다'등
  • 을 포함하지만 이에 국한되지 않는다
  • excel의 일부 열을 사용자 정의로 비추어야 한다(예를 들어 실체 클래스와 excel에 [Status]가 있다. 우리는 excel의 [Status]를'1'이라고 쓰고'활성화'라고 쓰는 것을 모두 실체 클래스의 [Status]를'1'이라고 채워야 한다)
  • 상기 문제들은 기본 클래스를 통해 제공하는 방법만으로는 실현할 수 없기 때문에 본 글은 상기 문제를 해결하기 위해 고도의 사용자 정의 Excel 가져오기를 모듈을 통해 실현한다.
    데모 프로그램 구조 개요
      
      
    ps:퇴근해야 되는데 오늘은 이만큼 먼저 보내고,
    여러분은 먼저 데모를 내려서 보셔도 됩니다. 기능이 모두 실현되었고 문제가 있으면 모두 함께 의사소통을 할 수 있습니다.
    만약 여러분이 구체적인 절차를 알고 싶다면, 제가 다시 첨가하겠습니다.
    생각을 실현하다
    우선, 우리의 요구 사항은 다음과 같습니다.
  • c# 기술을 사용하여 excel을 프로그램에 가져오고List의 형식으로 존재
  • excel의 열 이름과 Entity의 속성에 대한 대응 관계를 사용자 정의할 수 있습니다. excel의 여러 열 이름이 Entity의 같은 속성에 대응하는 것도 지원하고 Entity의 여러 속성이 excel의 한 열 이름에 대응하는 것도 지원합니다
  • excel의 값 변환 함수를 사용자 정의할 수 있습니다. excel에'상태'열이 Entity의 Status 속성에 대응하고 excel의'상태'열에 [활성화] 또는 [1]를 쓰면 최종적으로 Status의 [true]
  • 에 대응한다고 가정합니다.
  • excel에서 열거한 값의 유효성 검증 함수를 사용자 정의할 수 있음
  • 다음은 이러한 기능의 실현에 대해 간략하게 설명한다.
  • 클래스 [public class Import Utilwhere Entity:new()]는 excel의 가져오기 기능을 실현했고 Entity는 실체 클래스 유형
  •     /// <summary>
    
        ///       excel   By Dean 20140320
    
        ///     :1           excel          excel     JHB、   、PV  ,          JHB  
    
        ///2           excel          excel    “  ” ,         Code & Name   ,   Code      “  ” ,         ,  “  ” DB   Code   
    
        ///       :1             
    
        ///           2          excel               ,       
    
        ///           3    excel                
    
        /// </summary>
    
        /// <typeparam name="Entity"></typeparam>
    
        public class ImportUtil<Entity> where Entity : new()
  • ImportUtil 클래스에 유일한 구조 함수 [public ImportUtil(DictionaryallColumns)]
  •   public ImportUtil(Dictionary<string, string> allColumns)
    
       {
    
            AllColumns = allColumns;
    
       }
           //     excel      
    
                Dictionary<string, string> allColumns = new Dictionary<string, string>
    
                {
    
                    {"ID","  "},
    
                    {"StudentID","    |  ID"},{"StudentName","    |  ID"},
    
                    {"DisciplineID","    "},{"DisciplineName","    "},
    
                    {"Score","    "},
    
                    {"MakeUpExamTime","    "}
    
                };

     
    이 구조 함수는 매개 변수 all Columns를 전송합니다. Dictionary 형식입니다. 이 매개 변수는 수요 2를 실현했습니다. 사전의Key는 실체류 Entity의 [속성 이름] 이고 사전의Value는 excel의 [열 이름] 이며 |를 사용하여 excel의 여러 열 이름을 지원합니다.
  • ImportUtil류 중 유일하게 대외적으로 공개하는 방법이 있다[public ListGetEntity List]
  •         /// <summary>
    
            ///   excel           《          》
    
            /// </summary>
    
            /// <param name="fileName">excel   </param>
    
            /// <param name="errorInfo">                   </param>
    
            /// <param name="converterFields">             </param>
    
            /// <param name="customConverts">           (key        ,value   excel               Func)</param>
    
            /// <param name="dataValidateChecks">   excel         , excel          </param>
    
            /// <returns>     </returns>
    
            public List<Entity> GetEntityList(string fileName,
    
                                              List<string> errorInfo,
    
                                              Dictionary<KnownDataType, List<string>> converterFields = null,
    
                                              Dictionary<string, Func<object, object>> customConverts = null,
    
                                              Dictionary<string, Func<object, string>> dataValidateChecks = null)

    이 방법은 5개의 입력 매개 변수가 있는데 그 중에서 fileName과errorInfo는 반드시 져야 한다. 방법은 최종적으로 우리가 필요로 하는List로 되돌아간다. 방법의 실행 과정은 excel의 주소를 통해 excel을 DataTable라고 가져온 다음에 DataTable를List로 변환하고 변환하는 과정에서 데이터의 유효성 검증과 데이터 값의 유형 변환을 하는 것이다.
    이 5개의 매개변수는 다음과 같습니다.
  • fileName,string, 가져올 excel의 주소;
  • errorInfo,List, 가져오는 과정에서 발생하는 오류 정보;
  • convertFields,Dictionary,미리 정의된 유형 변환;excel의 열은 모두 Object 형식이지만 Entity의 속성은 강한 유형입니다. Int,Decimal,Double,DateTime에 대해 관련 변환 함수를 정의했습니다. Entity 속성 이름만 전송하고 DataTable에서 List로 전환할 때 Column의 값에 대응하는 미리 정의된 유형 변환을 할 수 있습니다.
               //       
    
                Dictionary<KnownDataType, List<string>> convertFields = new Dictionary<KnownDataType, List<string>>
    
                {
    
                    {KnownDataType.Int, new List<string> {"ID", "StudentID", "DisciplineID"}},
    
                    {KnownDataType.Double, new List<string> {"Score"}}
    
                };

  • customConverts,Dictionary>, 사용자 정의 유형 변환;미리 정의된 형식 변환은 보통 excel의 열을 대응하는 형식으로 바꾸거나 기본값을 주는 일반적인 작업이지만, 우리는 흔히 excel의 열에 대해 사용자 정의 변환을 해야 한다. 예를 들어 excel에는 '번호' 열이 있고, Entity에 대응하는 'ID', 'Name' 속성을 설정하며, 'ID' 속성은 직접 미리 정의된 변환을 사용하여 완성할 수 있다.'Name' 열은 '번호' 를 통해 데이터베이스에서 'Name' 을 찾아서 'Name' 에게 값을 부여해야 합니다.따라서 이럴 때는 사용자 정의의 전환이 필요하다.쓰기 방법은 다음과 같습니다.
                //       
    
                Dictionary<string, Func<object, object>> customConverts = new Dictionary<string, Func<object, object>>
    
                {
    
                    {
    
                        "StudentName", currColumn =>
    
                        {
    
                            int studentID;
    
                            if (currColumn != null && int.TryParse(currColumn.ToString(), out studentID))
    
                            {
    
                                var r = DataPool.EntireStudents.Find(c => c.ID == studentID);
    
                                if (r != null)
    
                                {
    
                                    return r.Name;
    
                                }
    
                            }
    
                            return string.Empty;
    
                        }
    
                    },
    
                    {
    
                        "MakeUpExamTime", currColumn =>
    
                        {
    
                            DateTime colDateTime;
    
                            if (currColumn != null && DateTime.TryParse(currColumn.ToString(), out colDateTime))
    
                            {
    
                                return colDateTime;
    
                            }
    
                            return null;
    
                        }
    
                    }
    
                };

  • 데이터Validate Checks,Dictionary>,excel열의 데이터 유효성 검증,Entity의 모든 속성의 값을 부여하기 전에 excel의 데이터가 유효한지 검증합니다.Key는 검증할 속성의 이름입니다.Value는 Func이고 입력 매개 변수는 excel의 열값입니다.되돌아오는 것은string이고 검증이 통과될 때는string입니다.Empty, 검증을 통과하지 못하면 오류 메시지가 반환됩니다.쓰기 방법은 다음과 같습니다.
                //excel                excel                     
    
                Dictionary<string,Func<object,string>> dataValidateChecks = new Dictionary<string, Func<object, string>>
    
                {
    
                    {
    
                        "ID", currColumn =>
    
                        {
    
                            int idInt;
    
                            if (currColumn!=null&&int.TryParse(currColumn.ToString(),out idInt))
    
                            {
    
                                return string.Empty;
    
                            }
    
                            return "ID          ";
    
                        }
    
                    }
    
                };
                //  excel  
    
                var res = importUtil.GetEntityList(excelPath, errors, convertFields, customConverts, dataValidateChecks);


  • 총결산
    이상은 excel의 사용자 정의 가져오기 기능을 완성했습니다. 감사합니다.
    데모 소스

    좋은 웹페이지 즐겨찾기