如何使用 C# 将数据从 Excel 的一列导入到列表框
本文关键字:一列 导入 列表 何使用 数据 Excel | 更新日期: 2023-09-27 18:32:00
我有一个打开的文件对话框工具。我将从我的计算机中选择一个 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
.
因此,要总结下面的代码示例,请执行以下操作(单击按钮):
- 根据文件扩展名确定 Excel 文件类型。
- 根据 excel 文件类型选择正确的 OLEDB 提供程序以生成连接字符串。
- 确定 Excel 文件中包含的工作表名称。 选择
- 第一个工作表,选择所有行并将这些行存储在名为
mytable
的数据表中。 - 显示名为
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"];
}