繁体   English   中英

如何将特定的 excel 单元格值导入 C# 中的现有 datagridview 单元格

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM