如何按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
相关产品推荐
相关产品推荐

