excel 如何从DataTable中删除空行和多余的列

de90aj5v  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(100)

我有一个使用ExcelReaderFactory从Excel导入数据到DB的过程。但是当有空行/列时,我们面临问题。下面是我的原始代码:

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

字符串
它产生了两个问题:
1.如果end中有空行,它们将在datatable中。
1.如果最后有空列,它们将在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;


但它不会删除空列。有更好的方法吗?
如何删除空列?
请参考下面的图片。x1c 0d1x

vuktfyat

vuktfyat1#

你可以使用这个扩展:

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);
    }
}

字符串
如果你想从一个给定的索引开始,把它传递给方法。

polhcujo

polhcujo2#

要回答完整的问题,包括删除空白行,请使用此扩展名:

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);
            }
        }

字符串
要排除用户定义的列,请在列数组上的.ToArray()之前添加此Where

.Where(col=>col.ColumnName.StartsWith("Column"))

相关问题