2016-12-28 2 views
0

У меня есть три колонки в листе Excel:Получение данных из Excel содержит специальный символ, используя OLEDB C#

  1. CompanyName
  2. PhoneNo
  3. EMAILID

При попытке получить данные из Excel, если лист содержит 012-231564 тип данных в столбце PhoneNo, то полученный DataSet содержит пустую ячейку

var connString = string.Format("Provider=Microsoft.Jet.OleDb.4.0; 
Data Source={0};Extended Properties=\"Text;HDR=YES;FMT=Delimited\"", 
Path.GetDirectoryName(Server.MapPath("~/DataMiningFiles/" + StrFileName))); 

var query = "SELECT * FROM [" + Path.GetFileName(Server.MapPath("~/DataMiningFiles/" + StrFileName)) + "]"; 

using (var adapter = new OleDbDataAdapter(query, conn)) { 
    var ObjGetExcelData = new DataSet("CSV File"); 
    adapter.Fill(ObjGetExcelData); 
} 

ответ

0

Существует довольно немного, я бы изменил об этом tbh. Итак, давайте посмотрим ...

  1. Я бы не использовал этот драйвер, так как он является обозревателем. Используйте Microsoft.ACE.OLEDB.12.0
  2. Для импорта смешанных типов данных необходимо указать IMEX = 1.
  3. Ваши расширенные свойства определяют импорт текстового файла, но вы сказали, что хотите импортировать Excel. Если это так, укажите это.
  4. Обычно я читал эту таблицу за столом. Я не знаком с вашей попыткой прочитать лот в DataSet. Может быть, мне пора, если мне станет скучно в новом году. Этот пример будет работать, однако ...

    string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
              "Data Source=e:\\Test.xlsx;" + 
              "Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\""; 
    
    OleDbConnection oConnection = new OleDbConnection(); 
    oConnection.ConnectionString = sConnectionString; 
    oConnection.Open(); 
    
    //Find all readable Named Ranges and Worksheets 
    DataTable ExcelSheetNames = oConnection.GetSchema("Tables"); 
    
    foreach (DataRow SheetNameRow in ExcelSheetNames.Rows) 
    { 
        string SheetName = (string)SheetNameRow["Table_Name"]; 
    
        //Only handle WorkSheets. Named Ranges are otherwise named. 
        if (SheetName.EndsWith("$") | SheetName.EndsWith("$'")) 
        { 
         DataTable SheetContents = new DataTable(); 
    
         //Read the contents of the sheet into a DataTable 
         using (OleDbCommand oCmd = new OleDbCommand("Select * From [" + SheetName + "]", oConnection)) 
         { 
          SheetContents.Load(oCmd.ExecuteReader()); 
         } 
    
         //You can also put the DataTable load on one line (I do) 
         //SheetContents.Load(new OleDbCommand("Select * From [" + SheetName + "]", oConnection).ExecuteReader()); 
    
         //Print the content of cells A2..C2 to the console window 
         Console.WriteLine(SheetContents.Rows[0].ItemArray[0]); 
         Console.WriteLine(SheetContents.Rows[0].ItemArray[1]); 
         Console.WriteLine(SheetContents.Rows[0].ItemArray[2]); 
    
        } 
    } 
    
    oConnection.Close(); 
    

Кстати, пожалуйста, постарайтесь избежать использования «вар» переменных. Сильно наберите их, и вы спасете себя и других, страдающих от боли.

Если вы знаете имя листа вы хотите прочитать, вы можете просто закодировать все это, как ...

string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
           "Data Source=e:\\Test.xlsx;" + 
           "Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\""; 

    OleDbConnection oConnection = new OleDbConnection(); 
    oConnection.ConnectionString = sConnectionString; 
    oConnection.Open(); 

    DataTable SheetContents = new DataTable(); 

    SheetContents.Load(new OleDbCommand("Select * From [Sheet1$]", oConnection).ExecuteReader()); 

    Console.WriteLine(SheetContents.Rows[0].ItemArray[0]); 
    Console.WriteLine(SheetContents.Rows[0].ItemArray[1]); 
    Console.WriteLine(SheetContents.Rows[0].ItemArray[2]); 

    oConnection.Close(); 
Смежные вопросы