2014-02-18 54 views
1

我必須在Web應用程序中使用OleDB讀取Excel文件並將數據保存到數據庫中。用OleDB讀取Excel文件返回錯誤格式的UPC編號

訪問該文件並使用DataAdapter或OleDbDataReader讀取它的工作原理。我需要指定IMEX = 1和TypeGuessRows = 0,因爲文件中的數據有我需要解析的標題,但它們不在第一行。所以基本上,我需要讀取這些行,直到我找到一個已知的標題,然後開始解析其後的所有數據。

在第一列中有像這樣的價值觀UPC號碼:5053366261702 但是,即使在字段讀文本,該OleDbDataReader在這樣一個科學的方法返回的數字:5.05337E+12

如果我不」以文本形式讀取行,數字將正確返回,但標題將消失。

我添加了代碼的重要部分。預先感謝您的幫助。

string conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'"; 
using (OleDbConnection objConn = new OleDbConnection(conn)) 
{ 
     objConn.Open(); 
     var exceltables = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" }); 
     var tablename = exceltables.Rows[0]["TABLE_NAME"]; 
     using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "]", objConn)) 
     { 
      using (OleDbDataReader reader = objCmdSelect.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        string abc = reader[0].ToString(); //do some parsing 
       } 
      }      
     } 
} 

回答

1

我找到了適用於我的解決方案。我現在用兩個不同的連接字符串打開文件。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='filename.xlsx';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'

第一個到達頭,當我發現他們,我保存的行號,並與IMEX = 0再次打開該文件。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='filename.xlsx';Extended Properties='Excel 12.0;HDR=No;IMEX=0;ImportMixedTypes=Text;TypeGuessRows=0'

string connHeaders = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0'"; 
string connData = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties='Excel 12.0;HDR=No;IMEX=0;ImportMixedTypes=Text;TypeGuessRows=0'"; 

int dataStartRow = 0; 
string tablename = ""; 

#region Open file to find headers 
using (OleDbConnection objConn = new OleDbConnection(connHeaders)) 
{ 
    objConn.Open(); 
    var exceltables = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" }); 
    tablename = exceltables.Rows[0]["TABLE_NAME"].ToString(); 
    using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "] ", objConn)) 
    { 
     using (OleDbDataReader reader = objCmdSelect.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       if (reader[0].ToString().ToLower() == "upc") 
       { 
        for (int i = 0; i < reader.FieldCount; i++) 
        { 
         //find all necessary headers 
        } 
        break; 
       } 
       dataStartRow++; 
      } 
     } 
    } 
} 
#endregion 

#region Open file again to read data 
using (OleDbConnection objConn = new OleDbConnection(connData)) 
{ 
    objConn.Open(); 
    using (OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [" + tablename + "] ", objConn)) 
    { 
     using (OleDbDataReader reader = objCmdSelect.ExecuteReader()) 
     { 
      for (int i = 0; i < dataStartRow; i++) reader.Read(); 
      while (reader.Read()) 
      { 
       //read the line to save it in Database 
      } 
     } 
    } 
}