2017-01-02 3 views
0

Я читаю excel, имея миллион записей, сначала я обращаюсь к своей таблице (без записей) и получаю Datable. Я запрашиваю мою таблицу, чтобы получить имя столбца в качестве определения в моем листе excel, используя псевдоним.Как вставить данные из excel в datatable с заголовками?

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; 

Так мой DataTable выглядит так,

enter image description here

Затем я прочитал запись из Excel листа

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; 
       } 

Он читает успешно и заполнять данные в DataTable, но создать свою собственную колонку в таблице данных, например, от F1 до F10, как я могу переместить эти данные в соответствии с моими определенными столбцами в datatable

enter image description here

Как я Обойдется это не создавать другие столбцы (f1, f2..f10) любой обходной путь будет заметно или Пожалуйста, объясните, что я делаю неправильно и как я могу добиться этого.

UPDATE: My Excel файл выглядит как этот драйвер

enter image description here

+0

Как выглядит ваше превосходное впечатление? Снимок этого будет полезен. – Spidey

+0

Почему вы используете 'SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10 FROM [Sheet1 $]', а не '' select * из [Sheet1 $] '? – Spidey

+0

Я пробовал Оба запроса, оба дают одинаковые результаты –

ответ

1

Microsoft.ACE.OLEDB.12.0 будет обрабатывать оба типа таблицы Excel и используя те же расширенные свойства. то есть «Excel 12.0» откроет оба .xls и .xlsx.

Оставьте HDR = NO, как OLEDB ожидает их в первом ряду, и они на самом деле в строке 11.

К сожалению «TypeGuessRows = 0; ImportMixedTypes = Текст» полностью игнорируется Microsoft.ACE.OLEDB.12.0 , вам нужно поиграть с реестром (yuk). Измените IMEX = 2 на IMEX = 1, чтобы убедиться, что смешанные типы данных обрабатываются как текст.

Возврат к использованию «Выбрать * Из [Лист1 $]», а затем я хочу, чтобы вы вручную обрабатывали исходные данные.

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 и вставить данные в таблицу Oracle.

Некоторые мысли, ваша таблица возврата будет содержать данные, поэтому, если вы просто хотите структуру таблицы, добавьте «Where RowNum = 0» в оператор Select. Чтобы добавить данные в свою базу данных Oracle, вы можете: 1) конвертировать в Oracle Data Provider (ODP), а затем использовать с помощью OracleBulkCopy Class или 2) просто изменить выше, чтобы вставлять строку за строкой при чтении данных. Пока у вас нет большого количества данных в электронной таблице Excel, все будет работать нормально. Сказав, что миллион строк - это LOT, поэтому, возможно, это не самый лучший вариант. Вам нужно будет подтвердить ввод, поскольку Excel не лучший источник данных.

 Смежные вопросы

  • Нет связанных вопросов^_^