【问题标题】:How to Iterate through Excel Sheets Data to DataGridView?如何将 Excel 表格数据迭代到 DataGridView?
【发布时间】:2020-11-04 09:27:27
【问题描述】:

我想有效地遍历 Excel 表到 DataGridView。如何修改以下代码片段: (string.Format("Select * From [{0}$]", s) 以循环第一个 Excel-Sheet(Excel1.xls) 中的表?这是我的代码到目前为止。我很感激任何建议!

  TextBox textBox1 = new TextBox();
  TextBox textBox2 = new TextBox();

  textBox1.Text = @"C:\Users\Desktop\Test\Excel1.xls";

  string[] s;
  s = new string[2] { "Table1", "Table2" };

  String constr = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + 
  textBox1.Text + " ; Extended Properties =\"Excel 8.0; HDR=Yes;\";";
  OleDbConnection con = new OleDbConnection(constr);
        
 for (int i = 0; i < s.Length; i++)
 {
    if (s[0] == "Table1")
    {
     OleDbDataAdapter sda = new OleDbDataAdapter(string.Format("Select * From [{0}$]", s), con);

     DataTable data = new DataTable();
     sda.Fill(data);
     dataGridView1.DataSource = data;
     //condition1...
    }

  for (int j = 0; j < s.Length; j++)
  {
     if (s[1] == "Table2")
     {
      OleDbDataAdapter sda = new OleDbDataAdapter(string.Format("Select * From [{1}$]", s), con);
      DataTable data = new DataTable();
      sda.Fill(data);
      dataGridView1.DataSource = data;
      //condition2...
     }
  }

 }

【问题讨论】:

  • excel 中的工作表是 oleDb 库中的表格,工作表名称末尾有一个美元符号:From [" + textBox2.Text + "$]。因此,要遍历工作表,您需要将 textBox.Text 的值更改为每个工作表名称。
  • 谢谢你!是否应该在 foreach 循环之前进行更改?
  • 无论你如何实现,只要你得到每张纸。
  • 您想做的事情似乎脱节了。对于初学者,代码似乎覆盖了dataGridView1 中先前阅读的工作簿。因此,网格将仅包含数组中的最后一个工作簿。这很尴尬,我猜您可能想将每个DataTable 放入DataSet?下一个有问题的代码……textBox1.Text = @"C:\Users\Desktop\Test\" + ExcelSheet; ??? ExcelSheet 是一个字符串数组string[]……代码不应该是……textBox1.Text = @"C:\Users\Desktop\Test\" + s;
  • 嗨,jdweng 和 JohnG。对于迟到的回复,我深表歉意。它背后的想法要大得多。在 TexBox 中输入搜索词后,将在 ExcelSheets 中执行搜索。在一个或两个 ExcelSheets 中找到的搜索词应显示在 ListBox 中。我担心找到一种方法来循环遍历 Excel 表格。我不得不承认,如果它有效,我对此仍有一些疑问。但是,我要感谢您的所有评论!

标签: c# excel datagridview


【解决方案1】:

看来你把事情复杂化了。此外,不清楚从 Excel 工作表获取数据“之后”要做什么。你的问题的标题有点混乱……

“如何将 Excel 表格数据迭代到 DataGridView?”

DataGridView 一次只能保存一 (1) 个工作表,这在某种意义上令人困惑。在您当前的代码中,foreach 循环的末尾有一行代码...dataGridView1.DataSource = data;?这很奇怪,因为一旦设置了网格数据源,代码就会循环备份并将其替换为列表中的下一个工作簿。您最终会看到显示列表中最后一个工作簿的网格,而之前阅读的工作簿很好……丢失了。

鉴于此,我假设您希望保留而不是丢失以前阅读的工作簿。这可以使用DataSet 来完成。阅读每个工作簿后,我们会将 DataTable 添加到 DataSets Tables 集合中,而不是将其分配给网格。这样,“在”您阅读完所有工作簿之后,您就可以在网格中显示任何一个表格。

接下来不清楚“为什么”代码将 Excel 文件路径和工作表名称添加到文本框中。这看起来很奇怪,为了简化事情,下面的代码使用简单的字符串作为文件路径和工作表名称。

接下来,每当您在代码中打开 Excel 或其他对象时,应确保这些对象已释放或关闭。在这种情况下,我们要确保OleDbConnection 对象在代码退出时被关闭。如果一切正常,using 语句是一个很好的方法,它将为您关闭连接。然后,整个代码被包装在try/catch/finally 语句中。在finally 部分,代码可以检查并确保即使代码崩溃,连接也会关闭。

鉴于此,下面的代码演示了如何读取 Excel 文件。在下面的函数中,传入 Excel 工作簿的字符串数组并返回 DataSet,其中 DataSets Tables 集合将包含所有读取的 Excel 工作表。

传入的字符串数组将在foreach 循环中使用。在foreach 循环中,我们将workBookName 数组中的文件名的路径与workSheetName 一起添加。

使用工作簿名称构建连接字符串。 将此连接字符串设置为连接con。 接下来,为OleDbDataAdapter sda 构建“选择”命令。 创建一个新的DataTable tempDT 以从选择命令中填充。然后填表。 最后将填充的DataTable 添加到DataSet ds 变量中。 在此代码之后,将返回 DataSet

一旦你有了这个DataSet,你就可以将网格分配给DataSetsTable集合中的任何一个DataTables

下面的代码演示了上面的描述。

private DataSet GetExcelWorksheets(string[] workbooks) {
  DataSet ds = new DataSet();
  string workBookName;
  string workSheetName;
  string constr;
  DataTable tempDT;
  OleDbConnection con = null;
  try {
    using (con = new OleDbConnection()) {
      using (OleDbDataAdapter sda = new OleDbDataAdapter()) {
        foreach (string wb in workbooks) {
          workBookName = @"D:\Test\Excel_Test\" + wb;
          workSheetName = "Sheet1"; // "Table1";
          constr = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + workBookName + " ; Extended Properties =\"Excel 8.0; HDR=Yes;\";";
          con.ConnectionString = constr;
          sda.SelectCommand = new OleDbCommand("Select * From [" + workSheetName + "$]", con);
          tempDT = new DataTable();
          sda.Fill(tempDT);
          ds.Tables.Add(tempDT);
        }
      }
    }
  }
  catch (Exception ex) {
    MessageBox.Show("Error: " + ex.Message);
  }
  finally {
    if (con != null) {
      con.Close();
    }
  }
  return ds;
}

用法……

private void button1_Click(object sender, EventArgs e) {
  string[] ExcelBooks = { "Book1.xls", "DemoTrainingData.xls" };
  DataSet ds = GetExcelWorksheets(ExcelBooks);
  dataGridView1.DataSource = ds.Tables[0];
}

【讨论】:

  • JohnG,我不知所措,因为这太棒了!这正是我一直在寻找的!!!你说得对,我已经用相当复杂的术语表达了这一点。我带来的不便表示歉意。为您的麻烦,我衷心感谢您!!!
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2017-02-22
相关资源
最近更新 更多