2017-01-02 8 views
0

나는 처음으로 나는 나의 테이블 (기록 없음)을 조회하고 Datable를 얻는 것과 같이 백만개의 기록이있는 것을 능가한다. 별칭을 사용하여 Excel 시트에서 정의한 것과 같이 열 이름을 가져 오기 위해 테이블을 쿼리합니다. 이 같은 내 데이터 테이블 외모헤더가있는 데이터 테이블에 Excel의 데이터를 삽입하는 방법은 무엇입니까?

var dal = new clsConn(); 

       var sqlQuery = "SELECT FETAPE_THEIR_TRANDATE \"Date\" ,ISSUER Issuer, ISSU_BRAN Branch , STAN_NUMB STAN, TERMID TermID, ACQUIRER Acquirer,DEBIT_AMOUNT Debit,CREDIT_AMOUNT Credit,CARD_NUMB \"Card Number\" , DESCRIPTION Description FROM ALLTRANSACTIONS"; 
       var returntable = dal.ReadData(sqlQuery); 
       DataRow ds = returntable.NewRow(); 
       var dtExcelData = returntable; 

enter image description here

그럼 난 엑셀 시트에서 레코드를 읽을

OleDbConnection con = null; 
       if (ext == ".xls") 
       { 
        con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;"); 

       } 
       else if (ext == ".xlsx") 
       { 
        con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=2;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""); 
       } 
       con.Open(); 
       dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
       string getExcelSheetName = dt.Rows[0]["Table_Name"].ToString(); 
       //OleDbCommand ExcelCommand = new OleDbCommand(@"SELECT * FROM [" + getExcelSheetName + @"]", con); 
       OleDbCommand ExcelCommand = new OleDbCommand("SELECT F1, F2, F3, F4, F5,F6,F7,F8,F9,F10 FROM [Sheet1$]", con); 

       OleDbDataAdapter ExcelAdapter = new OleDbDataAdapter(ExcelCommand); 

       try 
       { 
        ExcelAdapter.Fill(dtExcelData); //Here I give the datatable which i made previously 
       } 
       catch (Exception ex) 
       { 
        //lblAlert2.CssClass = "message-error"; 
        //lblAlert2.Text = ex.Message; 
       } 

성공적으로 읽고 데이터 테이블에 데이터를 입력하지만, 자신의 열을 생성 F1에서 F10과 같은 데이터 테이블에서 데이터 테이블의 정의 된 열과 정확하게 일치하도록이 데이터를 이동할 수 있습니까

enter image description here

어떻게 어떤 해결 방법은 감지 할 수있을 것입니다 다른 열 (F1, f2..f10) 을 만들거나 내가 뭘 잘못 설명하고 내가 이것을 달성 할 수있는 방법 제발하지 않도록이를 관리하게됩니다.

UPDATE : 내 엑셀 파일이

enter image description here

+0

어떻게 탁월 해 보이나요? 그 스냅 샷이 도움이 될 것입니다. – Spidey

+0

왜 'SELECT1, F2, F3, F4, F5, F6, F7, F8, F9, F10 FROM [Sheet1 $]'을 사용하고 '[Sheet1 $]'에서 '* 선택하지 않습니까? – Spidey

+0

두 가지 쿼리를 시도했습니다. 둘 다 같은 결과를 나타냅니다. –

답변

1

Microsoft.ACE.OLEDB.12.0의 엑셀 스프레드 시트의 두 가지 유형을 처리하는 드라이버와 같은 확장 된 속성을 사용하는 것 같습니다. 즉 "Excel 12.0"은 .xls와 .xlsx를 모두 엽니 다. 완전히 Microsoft.ACE.OLEDB.12.0에 의해 무시됩니다

슬프게도 "하면 ImportMixedTypes = 텍스트가 TypeGuessRows이 0 ="11 OLEDB는 첫 번째 행을 기대하고 그들이 행에 실제로으로

은 NO = HDR를 남겨 , 당신은 레지스트리 (yuk)로 놀아야한다. 혼합 된 데이터 형식을 텍스트로 처리하도록 IMEX = 2를 IMEX = 1로 변경하십시오.

"Select * From [Sheet1 $]"로 다시 변경하면 원본 데이터를 수동으로 처리해야 할 것입니다.

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO\""); 
con.Open(); 

DataTable dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

string getExcelSheetName = (string)dt.Rows[0]["Table_Name"]; 

DataTable xlWorksheet = new DataTable(); 

xlWorksheet.Load(new OleDbCommand("Select * From [" + getExcelSheetName + "]", con).ExecuteReader()); 

//More than 11 rows implies 11 header rows and at least 1 data row 
if (xlWorksheet.Rows.Count > 11 & xlWorksheet.Columns.Count >= 10) 
{ 
    for (int nRow = 11; nRow < xlWorksheet.Rows.Count; nRow++) 
    { 
     DataRow returnRow = returntable.NewRow(); 

     for (int nColumn = 0; nColumn < 10; nColumn++) 
     { 
      //Note you will probably get conversion problems here that you will have to handle 
      returnRow[nColumn] = xlWorksheet.Rows[nRow].ItemArray[nColumn]; 
     } 
     returntable.Rows.Add(returnRow); 
    } 
} 

나는 ALLTRANSACTION 테이블에 Excel 데이터를 추가하기를 원합니까? 당신은 지정하지는 않지만 이것의 가능한 결과입니다. 그렇다면이 일은 끔찍한 방법입니다. 전체 테이블을 메모리 추가 데이터로 읽은 다음 데이터베이스를 업데이트 할 필요가 없습니다. 엑셀 파일을 읽고 오라클 테이블에 데이터를 삽입하기 만하면됩니다.

당신의 returntable에는 데이터가 포함되어 있으므로 테이블의 구조 만 원한다면 "Where RowNum = 0"을 Select 문에 추가하십시오. Oracle Database에 데이터를 추가하려면 1) ODP (Oracle Data Provider)를 사용하여 변환 한 다음 OracleBulkCopy Class를 사용하거나 2) 단순히 데이터를 읽을 때 행별로 삽입하도록 위의 내용을 수정하십시오. Excel 스프레드 시트에 많은 양의 데이터가 없으면 정상적으로 작동합니다. 수백만 행은 많지 않으므로 아마도 최선의 선택이라고 할 수 있습니다. Excel이 실제로 최상의 데이터 소스가 아니므로 입력을 검증해야합니다.