如何将Excel工作表数据循环到DataGridView



我想高效地通过Excel工作表迭代到DataGridView。如何修改以下代码片段:(string.Format("Select*From[{0}$]",s(循环第一张Excel工作表中的表格(Excel1.xls(?。这是我目前掌握的代码。我很感激你的建议!

TextBox textBox1 = new TextBox();
TextBox textBox2 = new TextBox();
textBox1.Text = @"C:UsersDesktopTestExcel1.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工作表中获取数据后要做什么。你问题的标题有点令人困惑…

"如何在Excel工作表数据中循环到DataGridView?">

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

考虑到这一点,我认为您希望保留而不是丢失那些以前阅读过的工作簿。这可以使用DataSet来完成。读取每个工作簿后,我们将把DataTable添加到DataSetsTables集合中,而不是将其分配给网格。这样,"在"阅读了所有工作簿之后,就可以在网格中显示任何一个表。

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

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

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

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

使用工作簿名称生成连接字符串。将此连接字符串设置为连接con。接下来,为OleDbDataAdaptersda构建"select"命令。通过select命令创建一个新的DataTabletempDT来填充。然后填满表格。最后将已填充的DataTable添加到DataSetds变量中。在该代码之后,返回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:TestExcel_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];
}

相关内容

  • 没有找到相关文章

最新更新