如何从数据表中删除空行和多余列

3

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

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

这会引起两个问题:

  1. 如果末尾存在空行,则它们将在数据表中保留。

  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;

但是它不会移除空列。是否有更好的方法来实现呢?

如何同时移除空列?

请参考下面的图片: enter image description here


在导入之前尝试,将所需的数据范围定义为表。 - Karthick Gunasekaran
为什么 _color、option 和 _extension 不被视为空列? - Sunil
尝试使用 microsoft.ace.oledb 而不是 OpenXML 库。这样你可能就不会遇到这个问题了。 - T.S.
@T.S. 是的,那样可以解决问题,但现在不能切换到oledb。 - user1926138
@user1926138 然后使用表名导入。 - Karthick Gunasekaran
显示剩余3条评论
2个回答

4
您可以使用这个扩展程序:
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);
    }
}

如果您想从特定的索引开始,将其传递给该方法。

0
要回答完整的问题,包括删除空白行,请使用这个扩展程序:
        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"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接