【问题标题】:How to get specific data from excel sheet into textboxes如何将特定数据从excel表中获取到文本框中
【发布时间】:2019-08-21 14:46:29
【问题描述】:

我想使用搜索查询将 Excel 工作表中的特定数据获取到 winforms TextBoxes 中。 像这样的东西 "从 [Sheet1] 中搜索 *,其中员工编号 =1234"

我尝试了这段代码,但它不起作用。 每次说连接未正确初始化时,我都会遇到异常。

try{
OleDbConnection con = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;data source=Test.xls;Extended Properties=Excel 8.0;");
           con.Open();
           OleDbCommand oleDbCommand = new OleDbCommand("SELECT * FROM [Sheet1] where Staff Number=1234");

              OleDbDataReader oleDbDataReader = oleDbCommand.ExecuteReader();


                   TxtDateOfBirth.Text = oleDbDataReader.GetString(1);
                   TxtName.Text=oleDbDataReader.GetString(2);
.
.
.
.
      }
           catch(Exception ex)
           {
               MessageBox.Show(ex.ToString());
           }

这是一个简单的表单,用户可以在其中输入员工编号并在相关文本框中获取人员的详细信息。 我的大多数搜索结果都为我提供了将数据显示到 datagridview 中的解决方案,但我的问题有点不同,我知道我必须使用数据阅读器并执行它,但不知道为什么会出现这个问题。

任何指南都会非常有帮助。

【问题讨论】:

  • 您实际上并不需要 DataReader。您可以填充 DataTable 并使用列名称或索引将它们的值分配给控件的属性。 + 那张纸是没有标题的吗?查看连接字符串here(出现的第一个)。另外请注意,您可以使用ACE.OLEDB.12.0 而不是Jet.OLEDB.4.0 打开旧的.xls 文件(如果碰巧您也在阅读较新的.xlsx 格式)。
  • 另外,不要使用带空格的字段名称(例如,Staff Number => [Staff Number])。
  • 我还使用了没有 where 子句的字符串,它正在重新调整空结果。
  • 您是否阅读了我发布的链接中的内容?您的连接字符串不正确。此外,您还没有发布 Excel 数据表的结构。如前所述:它是否有标题?另外,数据单元格的范围是什么?
  • 对不起,我不明白标题是什么意思?我有两行,我使用 A1 到 E1 作为列名,使用 A2 到 E2 作为它们的值。我应该将列 nae 行调整为标题吗?

标签: c# excel winforms search textbox


【解决方案1】:

稍微调整了你的代码..

改进

更改了您的连接字符串,添加了HDR=Yes;,表示第一行包含列名,还添加了IMEX=1;,它告诉驱动程序始终将“混合”(数字、日期、字符串等)数据列作为文本读取。在使用员工数据库时,这些通常很有帮助。

问题

添加了变量以使其更简洁,并为您的 xls db 文件添加完整路径

Sheet1 之后添加了$,并按照上面其他帮助用户在 cmets 中的建议将[Staff Number] 包裹起来。

添加了oleDbDataReader.Read() 以通读结果,因为您上面的代码中也缺少这一点。

下面的示例代码适用于我。

try 
{           
    var xlsDbPath= "C:\\Temp\\Test.xls"; //<-- Full name of path
    var connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsDbPath+ ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
    var query = "SELECT * FROM [Sheet1$] WHERE [Staff Number] = 1234";  //<-- Add $ after Sheet1 and fix 'Staff Number'?

    using (var con = new OleDbConnection(connStr))
    {
        con.Open();
        using (var oleDbCommand = new OleDbCommand(query, con))
        {
            using (var oleDbDataReader = oleDbCommand.ExecuteReader())
            {
                while (oleDbDataReader.Read())  //Read through results
                {
                     TxtDateOfBirth.Text = oleDbDataReader.GetString(1);
                     TxtName.Text = oleDbDataReader.GetString(2);
                     //...  //Remember if value is not string you will get error
                     //...  //so if not string use .GetValue(1).ToString();
                } 
            }
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}

【讨论】:

  • 感谢您的大力帮助。我将测试此代码并标记您的答案。我正在使用升级版的 excel 表(2007 年及以后),这就是为什么我认为我应该使用 Microsoft.Jet.OLEDB.12.0 并将扩展名更改为 xlsx 。是否需要其他更改?
  • 尝试了这段代码并得到了这个错误,Data type missmatch in criteria expression,它所指的行是这个using (var oleDbDataReader = oleDbCommand.ExecuteReader())
  • 使用 xlsx (2007+) id 推荐 "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'" 因为 Microsoft.ACE.OLEDB.12.0 是较新版本的驱动程序。至于错误,我不确定你的列是如何格式化的(文本。数字等),所以在这里查看stackoverflow.com/questions/45861436/…
  • 请发布您的查询?
  • 工作就像一个魅力!谢谢。
【解决方案2】:

在我看来,您的代码存在一些问题:

1- 您应该在连接中放置 Excel 文件的完整地址,而不是“test.xls”。

2- 您的命令中的“Staff”和“Number”之间有一个空格。如果列名是“StaffNumber”,则不应有任何空格。我建议您先测试没有 where 子句的命令。

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多