C# 如何基于Excel搜索结果填充DataGridView并从DataGridView中删除空白标题?

C# 如何基于Excel搜索结果填充DataGridView并从DataGridView中删除空白标题?,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个表单和一个文本框,用户将在其中键入ProductId(FCID),然后按enter键,在此基础上,我想用搜索结果填充我的DataGridView 这里有两个问题: 如何根据用户输入的FCID从Excel中筛选记录 从Excel绑定数据源时,如何删除空白记录,如第二幅图所示 代码: private void txtProductId_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter)

我有一个表单和一个文本框,用户将在其中键入
ProductId(FCID)
,然后按enter键,在此基础上,我想用搜索结果填充我的DataGridView

这里有两个问题:

  • 如何根据用户输入的
    FCID
    从Excel中筛选记录

  • 从Excel绑定数据源时,如何删除空白记录,如第二幅图所示

代码:

private void txtProductId_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        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) { throw new Exception("Error, file doesn't exists!"); }
        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:
                strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                break;
        }
        OleDbConnection cnnxls = new OleDbConnection(strConn);
        OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls);
        oda.Fill(tbContainer);
        grdProductList.DataSource = tbContainer;
        e.Handled = true;
    }
}

我以前没有使用过Windows窗体

您可以指定包含要检索的数据的单元格范围。形式如下:

[sheet1$[Start Cell]:[End Cell]]
在您的情况下,您可以更改查询,仅包括从
B6
ZZ
的单元格(这似乎是包含数据的范围。根据需要进行调整):
请记住处置您创建的一次性对象或使用块在
中声明它们)

当然,您可以指定一个过滤器:

int fieldID = 204;
//
string query = $"SELECT * FROM [{sheetName}$B6:ZZ] WHERE FCID = {fieldID}"

using (OleDbConnection cnnxls = new OleDbConnection(strConn))
using (OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls))
{
    oda.Fill(tbContainer);
    grdProductList.DataSource = tbContainer;
}
或范围过滤器:

string query = $"SELECT * FROM [{sheetName}$B6:ZZ] WHERE FCID BETWEEN 204 AND 300"
或者,使用可变值:

int minValue = 204;
int maxValue = 300;
string query = $"SELECT * FROM [{sheetName}$B6:ZZ] WHERE FCID BETWEEN {minValue} AND {maxValue}"
.xls
格式不支持通用范围:

[sheet1$B6:ZZ]
将不被接受。
[sheet1$B6:O65535]
被接受:数据位于列范围
B6:O*

更新:(针对此问题):

鉴于Excel工作表的组成,需要明确指定字段名,否则生成的
DataTable
将包含空列:

int fieldID = 204;    
string fieldSelector = "[ FCID], [Product Name], [Category], [Sub Category], " +
                       "[Brand], [MRP], [Disc %], [Stock], [Discount Type]";

query = $"SELECT {fieldSelector} FROM [{sheetName}$B6:O65535] WHERE [ FCID] = {fieldID}";

可以参数化FCID='204'”部分的位置吗?是的,当然,相同的方法是,
{sheetName}
是一个参数。因此,类似于:
WHERE FCID='{SomeVariable}'
。这是使用插值字符串(
$
)。您也可以使用几乎完全相同的方式使用
string.Format
。我遇到了以下错误:“Microsoft Jet数据库引擎找不到对象”“rptdepentreport$B6:ZZ”“。请确保该对象存在,并且您正确拼写了其名称和路径名。”但我使用的是excel 2010,如何支持搜索xls?excel 2010 supports
.xlsx
格式(从2007年开始),我不知道您为什么要提到它。关于遗留的
.xls
,我不确定。我会看一看。注意,您可以使用
ACE.OLEDB.12.0
(或
16
)打开
.xls
文件。
int fieldID = 204;    
string fieldSelector = "[ FCID], [Product Name], [Category], [Sub Category], " +
                       "[Brand], [MRP], [Disc %], [Stock], [Discount Type]";

query = $"SELECT {fieldSelector} FROM [{sheetName}$B6:O65535] WHERE [ FCID] = {fieldID}";