Как заполнить DataGridView на основе результатов поиска Excel и удалить пустые заголовки из DataGridView? - PullRequest
1 голос
/ 19 марта 2019

У меня есть 1 форма с 1 TextBox, где пользователь наберет ProductId(FCID), нажмите клавишу ввода и, исходя из этого, я хочу заполнить свой DataGridView результатами поиска.

ЕстьЗдесь 2 проблемы:

  • Как отфильтровать записи из Excel на основании введенного пользователем FCID?

  • При привязке источника данных из Excel,Как удалить пустые записи, как показано на втором изображении?

enter image description here

enter image description here

Код:

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 Forms.

1 Ответ

1 голос
/ 19 марта 2019

Вы можете указать диапазон ячеек, которые содержат данные, которые вы хотите получить.В форме:

[sheet1$[Start Cell]:[End Cell]]

В вашем случае вы можете изменить запрос, включая только ячейки, с B6 на ZZ (что, по-видимому, является диапазоном, содержащим ваши данные. Адаптируйте его какНужно):
Не забудьте утилизировать созданные вами одноразовые объекты или объявить их в using блоках)

string sheetName = "Sheet1";
string query = $"SELECT * FROM [{sheetName}$B6:ZZ]"
OleDbDataAdapter oda = new OleDbDataAdapter(query, cnnxls); 
//(...)
oda.Dispose();

Вы, конечно, можете указать фильтр:

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}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...