Как загрузить только непустые строки таблицы Excel, используя oledb в C #? - PullRequest
9 голосов
/ 17 февраля 2011

Я импортирую таблицу Excel в DataTable, используя соединение oledb, как показано ниже.

private static DataTable UploadExcelSheet(string fileName)
    {
        DataTable uploadDataTable;
        using (OleDbConnection objXConn = new OleDbConnection())
        {
            objXConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName +
                                            ";Extended Properties=\"Excel 12.0;IMEX=1\"";

            objXConn.Open();

            OleDbCommand objCommand =
                new OleDbCommand("SELECT * FROM Template$ ", objXConn);
            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();

            // retrieve the Select command for the Spreadsheet
            objDataAdapter.SelectCommand = objCommand;

            // Create a DataSet
            DataSet objDataSet = new DataSet();

            // Populate the DataSet with the spreadsheet worksheet data
            objDataAdapter.Fill(objDataSet);
            uploadDataTable = objDataSet.Tables[0];
        }

        return uploadDataTable;
    }

Все работает нормально, но проблема возникает, когда пользователь удаляет содержимое нескольких строк перед загрузкой Excel. Он также читает эти пустые строки вместе с непустыми строками, и сохранение данных в базе данных не выполняется из-за нарушения бизнес-правила (отсутствует обязательное поле). То, что я пытался поставить условие где в запросе:

"SELECT * FROM  WHERE  not [CandidateId*] = 0 or not [Firstname*] = '' or not [Lastname] = '' or not [type*] = '' or not [DOB*] =" + DBNull.Value

Таким образом, он будет выбирать только те строки, в которых есть данные. Но я не могу сравнивать не строковое поле, то есть дату, целое число и т. Д., Которые появляются как DBNull, когда пусто. Может ли кто-нибудь, пожалуйста, предложить способ сделать это, я не хочу использовать DataReader.

Ответы [ 4 ]

17 голосов
/ 10 февраля 2012

Расширяя ответ vc, это удалит все строки, которые в каждом из его столбцов не содержат ничего или пробелов:

dataTable = dataTable.Rows.Cast<DataRow>().Where(row => !row.ItemArray.All(field => field is System.DBNull || string.Compare((field as string).Trim(), string.Empty) == 0)).CopyToDataTable();
12 голосов
/ 17 февраля 2011

Как насчет фильтрации строк после выполнения запроса с использованием Linq to object:

var filteredRows = uploadDataTable.Rows.Cast<DataRow>().Where(
  row => row.ItemArray.Any(field => !(field is System.DBNull)));
8 голосов
/ 17 февраля 2011

Использование

".. WHERE NOT ([Lastname] = '' OR [DOB*] IS NULL OR ... )
0 голосов
/ 12 марта 2013

Расширяя предыдущие ответы, это сработало для меня. Удалить строки, в которых все поля пусты.

Dim deleteRows = From row In result.AsEnumerable
                 Where row.ItemArray.All(Function(field) Equals(field, DBNull.Value))

For Each deleteRow In deleteRows
    deleteRow.Delete()
Next
...