[英]How to import specific cells of an Excel file into datagridview using c#
[英]How do I import specific excel cell values to existing datagridview cells in C#
我在如何使用从 excel 导入的特定 excel 单元格值(不是 excel 表)更新加载了来自 mysql 的数据的现有 datagridview 时遇到了麻烦。 可用的解决方案缝合导入整个工作表并替换现有的数据网格视图。 而其他人只是使列空白。
private void button1_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Excel File|*.xlx;*.xlsx;*.xlsm;";
if (dlg.ShowDialog() == DialogResult.OK)
{
textBox1.Text = dlg.FileName;
string name = "sheet1";
string constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + "; Extended Properties='Excel 12.0 XML;HDR=YES;';";
OleDbConnection Con = new OleDbConnection(constr);
OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + "$]", Con);
Con.Open();
OleDbDataAdapter sda = new OleDbDataAdapter(OleCon);
DataTable data = new DataTable();
sda.Fill(data);
dataGridView1.DataSource = data;
for (int i = 0; i < dataGridView1.RowCount - 1; i++)
{
dataGridView1.Rows[i].Cells["Ab"].Value = sda;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
尝试直接在 OLEDB 命令中查询列:
OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + " Index$AB]", Con);
我仍然不明白你想要做什么。 据我所知,有一个DataGridView
有一个DataSource
。 该DataSource
是一个DataTable
是从查询到一个数据库中创建。 此外,还有一个 Excel 工作簿,其中包含一些您想用来“覆盖”或添加到DataGridView
……这还不清楚。
根据您的评论,我猜您想打开 Excel 文件并只阅读工作簿的特定部分。 如前所述,发布的代码正在读取名为“Sheet1”的整个工作表。 如果这是正确的,那么这将专注于阅读工作簿的特定部分。
在您的描述中,您声明要获取…… “从 excel 导入的特定 excel 单元格值(不是 excel 表)” ? ... 这听起来很奇怪,因为工作簿中的每个单元格都在“工作表”上。 因此,如果您想从工作簿中获取特定单元格……那么您还必须指定一个工作表。
根据我的测试,使用 OLEDB 是可行的,但是您可能需要记住一些注意事项。 此外,除非您被迫使用 OLEDB,否则您可能需要考虑使用第三方 Excel 库阅读器。 有很多是免费的,根据我的理解,它们在很多方面都一样好,如果不是更好。 但是,我知道这可能不是一种选择。
如果您想从 Excel 工作表中获取“特定”数据列,则 select 语句可能类似于……
OleDbCommand OleCon = new OleDbCommand("SELECT Ab FROM [" + name + "$]", Con);
为了使上述 select 语句起作用,正如您的代码所做的那样……是在提供程序初始化中将标题行设置为: HDR=YES
。 此外,列名 ( Ab
) 不能有空格。 如果标题有空格,则必须用单引号“`”将其括起来。 这是波浪号“~”键的单引号。 双引号“””键不起作用。 如果您使用双引号键,它将被解释为文字,并且只会用该值填充该列。 您可以从中选择您想要的任何一列或多列。
OleDbCommand OleCon = new OleDbCommand("SELECT Ab, 'Expense Description' FROM [" + name + "$]", Con);
现在坏消息是,Excel 有一个坏习惯,即在单元格不包含值时将它们报告为“包含”值。 例如,在只有 1000 行数据的现有 Excel 工作表上使用上述选择语句返回 49,999 行。 我创建了一个新工作簿并添加了一些数据,上面的命令只返回包含数据的单元格。 重点是……如果你使用这个策略,检查返回的内容可能是谨慎的。 我相信当Fill
需要 15 秒或更长时间时,这将是显而易见的。
另一种方法是使用 Excel 的范围类型定义来选择单元格。 就像是…
OleDbCommand OleCon = new OleDbCommand("SELECT * FROM [" + name + "$B1:C1000]", Con);
在这里,您可以定义一系列单元格。 这里的缺点是列必须是连续的,或者至少我无法创建非连续的范围。 我知道您可以使用工作簿中的“定义”命名范围,但是我无法实现这一点。
拥有这些单元格后,我不确定如何将每一行与网格中的行进行匹配,但我认为这将是下一步。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.