2017-07-03 46 views
0

附加信息:Microsoft Office Access數據庫引擎找不到對象'C:\ Users \ username \ Documents \ sampleData.xls'。確保對象存在,並且正確拼寫其名稱和路徑名。Excel到DataGridView

錯誤是在

theDataAdapter.Fill(spreadSheetData); 

強調這裏的樣本數據I使用(以.csv試過,.xls的,.XLSX)

Name Age  Status  Children 
Johnny 34  Married  3 
Joey 21  Single  1 
Michael 16  Dating  0 
Smith 42  Divorced 4 

下面是相關的代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 
using System.Data.OleDb; 

namespace uploadExcelFile 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnImport_Click(object sender, EventArgs e) 
     { 
      var frmDialog = new System.Windows.Forms.OpenFileDialog(); 
      if (frmDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 

       string strFileName = frmDialog.FileName; 
       System.IO.FileInfo spreadSheetFile = new System.IO.FileInfo(strFileName); 


       scheduleGridView.DataSource = spreadSheetFile.ToString(); 
       System.Diagnostics.Debug.WriteLine(frmDialog.FileName); 
       System.Diagnostics.Debug.WriteLine(frmDialog.SafeFileName); 

       String name = frmDialog.SafeFileName;     

       String constr = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""", frmDialog.FileName); 

       OleDbConnection myConnection = new OleDbConnection(constr); 

       OleDbCommand onlineConnection = new OleDbCommand("SELECT * FROM [" + frmDialog.FileName + "]", myConnection); 

       myConnection.Open(); 

       OleDbDataAdapter theDataAdapter = new OleDbDataAdapter(onlineConnection); 
       DataTable spreadSheetData = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
       theDataAdapter.Fill(spreadSheetData); 
       scheduleGridView.DataSource = spreadSheetData; 
      } 
     } 
    } 
} 

scheduleGridView是DataGridViews名稱,& btnImport是導入Bu的名稱tton。

我已經安裝了2007 Office System Driver:Data Connectivity Components;這給了我AccessDatabaseEngine.exe,但從那裏我一直卡在這裏,不理解如何解決這個問題。不用說,文件路徑的完整性是正確的。有一個在路徑名中沒有奇怪的字符或者(空格,下劃線等)

迷你更新::(另一個死衚衕好像)

雖然最初的錯誤說「無法找到對象'C:\用戶\用戶名\ Documents \ sampleData.xls'「

在調試器中,異常讀取爲 當我查看詳細信息」C:\ Users \ username \ Documents \ sampleData.xls 「

所以我認爲錯誤是它沒有把路徑作爲一個迭代,但這篇文章C# verbatim string literal not working. Very Strange backslash always double 非常清楚地表明,這不是我的問題。

+0

你有沒有試過相對路徑,即只有文件名沒有目錄? –

+0

只是試了一下,得到了同樣的錯誤。相對而言,你的意思只是文件名。擴展名,是否正確? **其他信息:Microsoft Office Access數據庫引擎找不到對象'sampleData.xls'。 ** – JoeyG2677

+0

只是想知道您是否仔細檢查了文件擴展名是xls,而不是xls.xls? –

回答

1

我猜你可能什麼是從下面的代碼行返回被誤認爲...

DataTable spreadSheetData = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

DataTable從該行返回將有九(9)列(TABLE_CATALOG,TABLE_SCHEMA, TABLE_NAME,TABLE_TYPE,TABLE_GUID,DESCRIPTION,TABLE_PROPID,DATE_CREATED和DATE_MODIFIED)。此ONE(1)DataTable只返回「描述」整個選定Excel工作簿中的工作表和命名範圍。 DataTable中的每一行代表工作表或命名範圍。爲了區分工作表與命名範圍,此DataTable中的「TABLE_NAME」列具有工作表或範圍的名稱,並且每個「工作表」名稱都帶有美元符號($)。如果行中的「TABLE_NAME」值不以美元符號結尾,那麼它是一個範圍而不是工作表。

因此,當行

OleDbDataAdapter theDataAdapter = new OleDbDataAdapter(onlineConnection); 

吹燈並說,它無法文件中使用「文件名」的錯誤...有所預料的,因爲這條線正在尋找一個「工作」的名字,而不是一個文件名。在創建選擇命令的行上...

OleDbCommand onlineConnection = new OleDbCommand("SELECT * FROM [" + frmDialog.FileName + "]", myConnection); 

這是不正確的;你已經選擇了文件名,打開該文件

String constr = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""", frmDialog.FileName); 
OleDbConnection myConnection = new OleDbConnection(constr); 
myConnection.Open(); 

正確的OleDbCommand線應該是...

OleDbCommand onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "]", myConnection); 

這裏的問題是,當前的代碼是沒有得到工作表名稱。因此,我們不能從工作簿中「選擇」工作表,然後用工作表填充適配器。

的另一個問題是設置DataGridViewDataSourcespreadSheetData ...當你從Excel‘工作表’工作表上,你必須假設會有多張。因此,DataSet將作爲容器來保存工作簿中的所有工作表。 DataSet中的每個DataTable都是單個工作表,並且可以推測DataGridView一次只能顯示其中的一個(1)。鑑於此,下面是描述的更改以及添加按鈕以顯示DataGridView中的「下一步」工作表,因爲工作簿中可能有多個工作表。希望這是有道理的。

int sheetIndex = 0; 
DataSet ds = new DataSet(); 

public Form1() { 
    InitializeComponent(); 
} 

private void btnImport_Click(object sender, EventArgs e) { 
    var frmDialog = new System.Windows.Forms.OpenFileDialog(); 
    if (frmDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { 
    String constr = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""", frmDialog.FileName); 
    OleDbConnection myConnection = new OleDbConnection(constr); 
    myConnection.Open(); 
    DataTable spreadSheetData = myConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
    string sheetName = ""; 
    DataTable dt; 
    OleDbCommand onlineConnection; 
    OleDbDataAdapter theDataAdapter; 
    // fill the "DataSet" each table in the set is a worksheet in the Excel file 
    foreach (DataRow dr in spreadSheetData.Rows) { 
     sheetName = dr["TABLE_NAME"].ToString(); 
     sheetName = sheetName.Replace("'", ""); 
     if (sheetName.EndsWith("$")) { 
     onlineConnection = new OleDbCommand("SELECT * FROM [" + sheetName + "]", myConnection); 
     theDataAdapter = new OleDbDataAdapter(onlineConnection); 
     dt = new DataTable(); 
     dt.TableName = sheetName; 
     theDataAdapter.Fill(dt); 
     ds.Tables.Add(dt); 
     } 
    } 
    myConnection.Close(); 
    scheduleGridView.DataSource = ds.Tables[0]; 
    setLabel(); 
    } 
} 

private void setLabel() { 
    label1.Text = "Showing worksheet " + sheetIndex + " Named: " + ds.Tables[sheetIndex].TableName + " out of a total of " + ds.Tables.Count + " worksheets"; 
} 

private void btnNextSheet_Click(object sender, EventArgs e) { 
    if (sheetIndex == ds.Tables.Count - 1) 
    sheetIndex = 0; 
    else 
    sheetIndex++; 
    scheduleGridView.DataSource = ds.Tables[sheetIndex]; 
    setLabel(); 
} 
+0

感謝您的全面回答。 http://imgur.com/rPNCqww – JoeyG2677

0

我解決了它。那麼有一個解決方法。我曾經在這個線程中發現的Excel數據讀取器:How to Convert DataSet to DataTable

害得我https://github.com/ExcelDataReader/ExcelDataReader ^自述是太棒了,剛去的解決方案資源管理器中,右鍵單擊引用,在新箱管理的NuGet軟件包,選擇瀏覽,輸入ExcelDataReader,然後在.cs文件中確保包含「使用Excel」;在頂部,第一個鏈接中提到的代碼本質上是足夠的,但這是我對那些想知道的確切代碼。

var frmDialog = new System.Windows.Forms.OpenFileDialog(); 
     if (frmDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 


      /*string strFileName = frmDialog.FileName; 
      //System.IO.FileInfo spreadSheetFile = new System.IO.FileInfo(strFileName); 
      System.IO.StreamReader reader = new System.IO.StreamReader(strFileName); 
      */ 


      string strFileName = frmDialog.FileName; 

      FileStream stream = File.Open(strFileName, FileMode.Open, FileAccess.Read); 

      //1. Reading from a binary Excel file ('97-2003 format; *.xls) 
      IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); 
      //... 
      //2. Reading from a OpenXml Excel file (2007 format; *.xlsx) 
      //IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); 
      //... 
      //3. DataSet - The result of each spreadsheet will be created in the result.Tables 
      //DataSet result = excelReader.AsDataSet(); 
      //... 
      //4. DataSet - Create column names from first row 
      excelReader.IsFirstRowAsColumnNames = true; 
      DataSet result = excelReader.AsDataSet(); 

      DataTable data = result.Tables[0]; 

      //5. Data Reader methods 
      while (excelReader.Read()) 
      { 
       //excelReader.GetInt32(0); 
      } 


      scheduleGridView.DataSource = data; 
      excelReader.Close(); 
+0

這只是一個解決方案,但你最好找出並告訴我們爲什麼**'Microsoft Office Access數據庫引擎找不到對象' –

+0

嗯,這是做同樣任務的另一種方式。約翰的回答是正確的。兩種方法都有效,但他解釋了爲什麼我的想法不正確。我當前的解決方案不允許上傳.csv文件,但如果我真的需要它們,我總是可以回到這裏並利用John的解決方案。 – JoeyG2677