【问题标题】:Importing Excel File to DataGridView将 Excel 文件导入 DataGridView
【发布时间】:2014-01-30 10:44:28
【问题描述】:
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”。 确保对象存在并且拼写它的名称和路径 正确命名。如果“xlsx”不是本地对象,请检查您的网络 连接或联系服务器管理员。

我可以选择文件,但它没有填写数据集。

怎么办?

【问题讨论】:

    标签: c# excel datagridview


    【解决方案1】:

    在以下行中,您从 文件中进行选择:

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

    但是,您需要从 工作表 中进行选择,所以应该是这样的:

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

    您需要找出 Excel 文件的工作表名称,以便从中进行选择(工作表名称显示在工作表的选项卡中 - 只需在其上附加 $ 符号)。 文件名仅用于连接字符串,因此数据库引擎知道要打开哪个文件。

    考虑以下与 .NET 中通常的 SQL 数据库访问的类比:

    file name = database name
    sheet name = table name
    

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

    【讨论】:

    • 现在它给出错误'Sheet1$' is not a valid name。确保它不包含无效字符或标点符号,并且不要太长。
    • 在 Excel 中打开 Excel 文件时,要导入的工作表名称是什么?
    • 名称可根据用户,不指定具体名称
    • 用户根据自己选择文件
    • 你明白我在说什么吗? SQL 查询不能使用 Excel 文件的文件名!!您需要将 工作表名称(当您在 Excel 中查看时,您在 Excel 文件中的 选项卡 上看到的文本)传递给查询!!
    【解决方案2】:

    这是我在没有数据库配置的情况下将 excel 读取到 datagridview 的代码。

            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;  
    

    【讨论】:

      【解决方案3】:
          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;  
      

      【讨论】:

      • 这是在不指定名称时获取excel文件的方式。在按钮点击上写代码
      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多