如何使用C#将数据从一列Excel导入到列表框

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

为了成功使用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"]; }