Как удалить пустые строки и лишние столбцы из таблицы данных
У меня есть процесс для импорта данных из Excel в БД с помощью ExcelReaderFactory
, Но когда есть пустые строки / столбцы, мы сталкиваемся с проблемой. Ниже мой оригинальный код:
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileContent);
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();
DataTable dataTable = result.Tables[0].Rows
Это создает 2 проблемы:
Если в конце есть пустые строки, они будут там в datatable.
Если в конце будут пустые колонны, они будут там в датированных.
Есть ли способ удалить как пустые строки, так и столбцы. Я могу удалить пустые строки из данных, используя приведенный ниже код
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"))