将Excel文件导入到DataGridView

OpenFileDialog ofImport = new OpenFileDialog(); ofImport.Title = "Select file"; ofImport.InitialDirectory = @"c:\"; ofImport.FileName = txtFileName.Text; ofImport.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; ofImport.FilterIndex = 1; ofImport.RestoreDirectory = true; if (ofImport.ShowDialog() == DialogResult.OK) { string path = System.IO.Path.GetFullPath(ofImport.FileName); string query = "SELECT * FROM Customer.xlsx"; OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ofImport.FileName+";Extended Properties=" + "\"Excel 12.0 Xml;HDR=YES;IMEX=1\""; OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn); //DataSet dataSet = new DataSet(); adapter.Fill(dsSource); dataGridView1.DataSource = dsSource; } else { ofImport.Dispose(); } 

我想使用dataset检索Excel数据到DataGridViewdsSource是使用的数据集。

我正在获取的错误是在adapter.Fill(dsSource);

Microsoft Access数据库引擎找不到对象“xlsx”。 确保对象存在,并且正确拼写其名称和path名称。 如果“xlsx”不是本地对象,请检查您的networking连接或联系服务器pipe理员。

我可以select文件,但不是填充数据集。

该怎么办?

在下面一行中,您从文件中select:

 string query = "SELECT * FROM " + ofImport.FileName; 

你需要从表中select,所以这应该是这样的:

 string query = "SELECT * FROM [Sheet1$]"; // Note the '$' sign!! 

您需要找出Excel文件的表格名称,以便您可以从中进行select(表格名称显示在表格的表格中 – 只需附加$符号即可)。 文件名仅用于连接string,因此数据库引擎知道要打开哪个文件。

想一下.NET中通常的SQL数据库访问的类比:

 file name = database name sheet name = table name 

编辑
为了使事情更清楚:在下面的图片中,工作表名称以红色圈出。 在您的代码中,在select语句中写入表单名称,后跟一个美元符号。

在这里输入图像说明

这是我的代码读取excel到datagridview没有数据库configuration。

  DataTable dt = new DataTable("dataTable"); DataSet dsSource = new DataSet("dataSet"); dt.Reset(); Excel.Workbook ExWorkbook; Excel.Worksheet ExWorksheet; Excel.Range ExRange; Excel.Application ExObj = new Excel.Application(); openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm"; DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) // Test result. { ExWorkbook = ExObj.Workbooks.Open(openFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); ExWorksheet = (Excel.Worksheet)ExWorkbook.Sheets.get_Item(1); ExRange = ExWorksheet.UsedRange; for (int Cnum = 1; Cnum <= ExRange.Columns.Count; Cnum++) { dt.Columns.Add(new DataColumn((ExRange.Cells[1, Cnum] as Excel.Range).Value2.ToString())); } dt.AcceptChanges(); string[] columnNames = new String[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { columnNames[0] = dt.Columns[i].ColumnName; } //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); for (int Rnum = 2; Rnum <= ExRange.Rows.Count; Rnum++) { DataRow dr = dt.NewRow(); for (int Cnum = 1; Cnum <= ExRange.Columns.Count; Cnum++) { if ((ExRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null) { dr[Cnum - 1] = (ExRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString(); } } dt.Rows.Add(dr); dt.AcceptChanges(); } ExWorkbook.Close(true, Missing.Value, Missing.Value); ExObj.Quit(); dataGridView1.DataSource = dt; 
  DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { dt = dsSource.Tables[Index]; dt.Reset(); Excel.Workbook workbook; Excel.Worksheet NwSheet; Excel.Range ShtRange; Microsoft.Office.Interop.Excel.Application ExcelObj = new Microsoft.Office.Interop.Excel.Application(); OpenFileDialog filedlgExcel = new OpenFileDialog(); filedlgExcel.Title = "Select file"; filedlgExcel.InitialDirectory = @"c:\"; //filedlgExcel.FileName = textBox1.Text; filedlgExcel.Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*"; filedlgExcel.FilterIndex = 1; filedlgExcel.RestoreDirectory = true; if (filedlgExcel.ShowDialog() == DialogResult.OK) { workbook = ExcelObj.Workbooks.Open(filedlgExcel.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1); ShtRange = NwSheet.UsedRange; for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString())); } dt.AcceptChanges(); string[] columnNames = new String[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { columnNames[0] = dt.Columns[i].ColumnName; } //string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>() select dc.ColumnName).ToArray(); for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++) { DataRow dr = dt.NewRow(); for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++) { if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null) { dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString(); } } dt.Rows.Add(dr); dt.AcceptChanges(); } workbook.Close(true, Missing.Value, Missing.Value); ExcelObj.Quit(); dataGridView1.DataSource = dt;