【问题标题】:How to import data from one column of Excel to listbox using C#如何使用C#将数据从Excel的一列导入列表框
【发布时间】:2012-04-21 10:32:15
【问题描述】:

我有一个 openFileDialog 工具。我将从我的计算机中选择一个 excel 文件,我的程序读取一列(例如 A 列)并在 GUI 上写入我的列表框。我怎样才能通过 OleDB 做到这一点?我是 C# 的新手。如果你解释得详细一点,我会很高兴的。 感谢您的帮助。

【问题讨论】:

  • 使用 OleDB 有什么具体原因吗?
  • 由于项目的要求,我必须通过 OleDB 执行此操作。

标签: c# listbox oledb openfiledialog import-from-excel


【解决方案1】:

为了成功使用 OLEDB 提供程序,我们必须考虑几点。

  • Excel 2003 文件的 OLEDB 提供程序不同于用于 Excel 2007/2010 文件。所以,我们要做的第一件事 正在确定 Excel 文件格式以选择正确的提供程序。 在下面的代码示例中,我只是检查文件的扩展名以确定 Excel 文件格式。请注意,有更详细的方法可以 确定 Excel 文件格式(例如通过魔术字节)。

  • 要选择 Excel 工作表的所有行,我们需要知道 Excel 工作表。标准工作表名称取决于语言,并且 可由用户重命名。 因此,我们需要一种方法来确定包含的工作表的名称 在 Excel 文件中独立于语言(当然也独立于重命名的工作表)。 幸运的是,OleDbConnection 类提供了 一个名为GetOleDbSchemaTable 的方法,它允许我们获取所有 Excel 文件中的工作表名称。

  • 用于 Excel 的 OLEDB 提供程序 支持称为 HDR 的扩展属性。将HDR 设置为Yes 表示工作表的第一行包含列标题。 所以,如果你使用列标题,你应该设置 HDR=Yes

所以,总结一下下面的代码示例(点击按钮时):

  1. 根据文件扩展名确定 Excel 文件类型。
  2. 根据 excel 文件类型选择正确的 OLEDB 提供程序来构建连接字符串。
  3. 确定 Excel 文件中包含的工作表名称。
  4. 选择第一个工作表,选择所有行并将这些行存储在名为 mytable 的 DataTable 中。
  5. 在名为listbox1 的列表框中显示第一列的所有值。

代码示例:

private static bool IsExcelXmlFileFormat(string fileName)
{
  return fileName.EndsWith("xlsx", StringComparison.OrdinalIgnoreCase);
}

private void button1_Click(object sender, EventArgs e)
{
  // Open your FileOpenDialog and let the user select a file...

  string fileName = "c:\\temp\\myexcelfile.xlsx";      

  OleDbConnectionStringBuilder connStringBuilder =
    new OleDbConnectionStringBuilder();

  connStringBuilder.DataSource = fileName;
  if (IsExcelXmlFileFormat(fileName))
  {
    // Set HDR=Yes if first row contains column titles.        
    connStringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
    connStringBuilder.Add("Extended Properties", "Excel 8.0;HDR=NO;");        
  }
  else
  {
    connStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0";
    connStringBuilder.Add("Extended Properties", "Excel 8.0;");        
  }

  DataSet data = new DataSet();
  using (OleDbConnection dbConn = new OleDbConnection(connStringBuilder.ConnectionString))
  {
    dbConn.Open();

    DataTable sheets = dbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);                

    using (OleDbCommand selectCmd = new OleDbCommand(
      String.Format("SELECT * FROM [{0}]", sheets.Rows[0]["TABLE_NAME"]), dbConn))
    {
      using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter())
      {
        dbAdapter.SelectCommand = selectCmd;           
        dbAdapter.Fill(data, "mytable");                       
      }
    }
  }

  // To enumerate all rows use the following code.
  // foreach (DataRow row in data.Tables["mytable"].Rows)
  // {
  //   Console.Out.WriteLine(row[0]);
  // }

  // Display the values of column 0 in a listbox called listBox1.
  listBox1.ValueMember = data.Tables["mytable"].Columns[0].ColumnName;
  listBox1.DisplayMember = data.Tables["mytable"].Columns[0].ColumnName;
  listBox1.DataSource = data.Tables["mytable"];             
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2015-03-13
    相关资源
    最近更新 更多