Как удалить пустые строки и лишние столбцы из таблицы данных

У меня есть процесс для импорта данных из Excel в БД с помощью ExcelReaderFactory, Но когда есть пустые строки / столбцы, мы сталкиваемся с проблемой. Ниже мой оригинальный код:

IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileContent);
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();                    
DataTable dataTable = result.Tables[0].Rows

Это создает 2 проблемы:

  1. Если в конце есть пустые строки, они будут там в datatable.

  2. Если в конце будут пустые колонны, они будут там в датированных.

Есть ли способ удалить как пустые строки, так и столбцы. Я могу удалить пустые строки из данных, используя приведенный ниже код

IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileContent);
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

DataTable dataTable = result.Tables[0].Rows
                    .Cast<DataRow>()
                    .Where(row => !row.ItemArray.All(field => field is DBNull ||
                                                    string.IsNullOrWhiteSpace(field as string ?? field.ToString())))
                    .CopyToDataTable();

return dataTable;

Но это не удалит пустые столбцы. Есть ли лучший способ сделать это?

Как убрать и пустые столбцы?

Пожалуйста, найдите ниже изображение для справки. введите описание изображения здесь

2 ответа

Вы можете использовать это расширение:

public static void RemoveEmptyColumns(this DataTable table, int columnStartIndex = 0)
{
    for (int i = table.Columns.Count - 1; i >= columnStartIndex; i--)
    {
        DataColumn col = table.Columns[i];
        if (table.AsEnumerable().All(r => r.IsNull(col) || string.IsNullOrWhiteSpace(r[col].ToString())))
            table.Columns.RemoveAt(i);
    }
}

Если вы хотите начать с заданного индекса, передайте его методу.

Чтобы ответить на полный вопрос, включая удаление пустых строк, используйте это расширение:

              public static void RemoveEmptyColumnsAndRows(this DataTable table)
        {
            foreach (var column in table.Columns.Cast<DataColumn>().ToArray())
            {
                if (table.AsEnumerable().All(dr => dr.IsNull(column) || string.IsNullOrWhiteSpace(dr[column].ToString())))
                    table.Columns.Remove(column);
            }
            foreach (var row in table.Rows.Cast<DataRow>().ToArray())
            {
                if (row.ItemArray.All(field => field is DBNull || string.IsNullOrWhiteSpace(field as string)))
                    table.Rows.Remove(row);
            }
        }

Чтобы исключить определяемые пользователем столбцы, добавьте этоWhereперед.ToArray()в массиве столбцов:

      .Where(col=>col.ColumnName.StartsWith("Column"))
Другие вопросы по тегам