You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按FCID过滤Excel数据并填充DataGridView,同时移除空白行?

解决WinForms中Excel数据过滤与空白行移除问题

嘿,刚上手WinForms不用发愁,我来一步步帮你搞定这两个问题,直接结合你的代码来修改说明:

1. 根据输入的FCID过滤Excel记录

要实现按用户输入的ProductId(FCID)过滤,只需要在SQL查询语句中添加WHERE条件,把用户输入的值作为参数传入即可。这里用参数化查询,既能精准筛选,还能避免潜在的SQL注入风险:

// 替换原有的查询语句初始化代码
string query = string.Format("select * from [{0}$] where FCID = @FCID", sheetName);
OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls);
// 绑定用户输入的FCID值作为查询参数
oda.SelectCommand.Parameters.AddWithValue("@FCID", txtProductId.Text.Trim());

如果你的FCID是数字类型,记得把txtProductId.Text.Trim()转换成对应数值类型(比如int.Parse(txtProductId.Text.Trim())),避免类型不匹配的报错。

2. 移除DataGridView中的空白记录

OleDb读取Excel时,常会把表格末尾的空行也一并读入。我们可以在填充DataTable后,过滤掉那些所有列都为空值的行:

oda.Fill(tbContainer);
// 过滤空白行:移除所有字段都为空的行
tbContainer = tbContainer.AsEnumerable()
    .Where(row => !row.ItemArray.All(field => field is DBNull || string.IsNullOrWhiteSpace(field?.ToString())))
    .CopyToDataTable();

这段Linq代码会逐行检查所有字段,把全为空的行过滤掉,生成一个干净的DataTable用于绑定。

完整修改后的代码

把上面的改动整合到你的代码中,最终版本如下:

private void txtProductId_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // 先检查用户是否输入了FCID
        if (string.IsNullOrWhiteSpace(txtProductId.Text))
        {
            MessageBox.Show("请输入ProductId(FCID)!");
            return;
        }

        string pathName = txtFilePath.Text;
        string fileName = System.IO.Path.GetFileNameWithoutExtension(txtFilePath.Text);
        DataTable tbContainer = new DataTable();
        string strConn = string.Empty;
        string sheetName = fileName;
        FileInfo file = new FileInfo(pathName);

        if (!file.Exists)
        {
            MessageBox.Show("错误:文件不存在!");
            return;
        }

        string extension = file.Extension;
        switch (extension)
        {
            case ".xls":
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                break;
            case ".xlsx":
                strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
                break;
            default:
                MessageBox.Show("不支持的文件格式!");
                return;
        }

        // 使用using自动管理数据库连接,避免资源泄漏
        using (OleDbConnection cnnxls = new OleDbConnection(strConn))
        {
            try
            {
                cnnxls.Open();
                // 带参数的查询语句,精准过滤FCID
                string query = string.Format("select * from [{0}$] where FCID = @FCID", sheetName);
                OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls);
                oda.SelectCommand.Parameters.AddWithValue("@FCID", txtProductId.Text.Trim());
                oda.Fill(tbContainer);

                // 移除空白行(如果有数据的话)
                if (tbContainer.Rows.Count > 0)
                {
                    tbContainer = tbContainer.AsEnumerable()
                        .Where(row => !row.ItemArray.All(field => field is DBNull || string.IsNullOrWhiteSpace(field?.ToString())))
                        .CopyToDataTable();
                }

                grdProductList.DataSource = tbContainer;
                // 无匹配记录时提示用户
                if (grdProductList.Rows.Count == 0)
                {
                    MessageBox.Show("未找到匹配的ProductId记录!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"查询出错:{ex.Message}");
            }
        }

        e.Handled = true;
    }
}

额外小提示

  • 新增了using语句管理数据库连接,确保连接自动释放,避免资源浪费。
  • 加入了用户友好的提示弹窗,比如未输入FCID、文件不存在、查询出错等场景。
  • 如果FCID是数字类型,建议用int.TryParse做安全转换,避免输入非数字字符导致报错。

内容的提问来源于stack exchange,提问作者I Love Stackoverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:38:27