2017-05-02 141 views
0

此前我使用ExcelPackage從.xlsx文件中讀取數據。這工作正常,但後來我意識到ExcelPackage不適用於舊的.xls格式。所以我升級到使用OleDbConnection,而不是ExcelPackage這樣的:如何使用C#和OleDbConnection讀取.xlsx和.xls文件?

var file = HttpContext.Current.Request.Files[0]; 
DataTable sheetData = new DataTable(); 
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
    file.FileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""; 

using (OleDbConnection conn = new OleDbConnection(connStr)) 
{ 
    conn.Open(); 
    DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    string sheetName = dtSchema.Rows[0].Field("TABLE_NAME"); 
    OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
    sheetAdapter.Fill(sheetData); 
}

基本上只是嘗試讀取第一個電子表格那裏。但我得到的例外這個錯誤:

Cannot update. Database or object is read-only.

我在做什麼錯?那裏隱藏着某種更新操作嗎?

+0

嘗試關閉您在C#中閱讀的excel文件 –

+0

您是否打開Excel並偶然使用此特定文件? –

+0

我沒有在Excel中打開該文件。基督徒,你是什麼意思關閉文件?瘋了嗎? – Ryan

回答

0

嘗試這種情況:

OleDbConnection connection; 
OleDbCommand command; 
OleDbDataReader dr; 

     string commandText = "SELECT * FROM [Sheet1$]"; 
     string oledbConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
     @"Data Source=" + filename + ";" + 
     "Extended Properties=\"Excel 12.0;HDR=YES\";"; 
     connection = new OleDbConnection(oledbConnectString); 
     command = new OleDbCommand(commandText, connection); 

     try 
     { 
      connection.Open(); 
      dr = command.ExecuteReader(); 

      while (dr.Read()) 
      { 
       count++; 

       for (int i = 1; i < dr.VisibleFieldCount; i++) 
       { 
        Console.Writeln(""+dr[i].ToString()); 
       } 
      } 

      connection.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("" + ex.Message); 
      connection.Close(); 
     } 
+0

當我嘗試這樣做時:'Microsoft Office Access數據庫引擎無法打開或寫入文件''。它已經被另一個用戶專門打開,或者你需要查看和寫入其數據的權限。「# – Ryan

+0

@Ryan所以問題是你的文件。請檢查它是否在使用中,或者您是否有權編輯它:D – julanove

0

下面是返回從給定的excel文件路徑的DataSet的示例方法。返回的DataSet應該將工作簿中的每個Excel工作表都作爲中的DataTable。這似乎工作正常,希望它可以幫助。

private DataSet GetExcelDataSet(string path) { 
    string sheetName; 
    string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + 
         "; Jet OLEDB:Engine Type = 5; Extended Properties =\"Excel 8.0;\""; 
    DataSet ds = new DataSet(); 
    using (OleDbConnection con = new OleDbConnection(ConnectionString)) { 
    using (OleDbCommand cmd = new OleDbCommand()) { 
     using (OleDbDataAdapter oda = new OleDbDataAdapter()) { 
     cmd.Connection = con; 
     con.Open(); 
     DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
     for (int i = 0; i < dtExcelSchema.Rows.Count; i++) { 
      sheetName = dtExcelSchema.Rows[i]["TABLE_NAME"].ToString(); 
      DataTable dt = new DataTable(sheetName); 
      cmd.Connection = con; 
      cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; 
      oda.SelectCommand = cmd; 
      oda.Fill(dt); 
      dt.TableName = sheetName; 
      ds.Tables.Add(dt); 
     } 
     } 
    } 
    } 
    return ds; 
}