【问题标题】:How to remove empty rows and extra columns from datatable如何从数据表中删除空行和多余的列
【发布时间】:2018-10-28 20:24:34
【问题描述】:

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

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

它产生了 2 个问题:

  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;

但它不会删除空列。 有没有更好的方法?

如何删除空列?

请在下面找到图片以供参考。

【问题讨论】:

  • 导入前先试试,把需要的数据范围定义为Table
  • 为什么 _color、option 和 _extension 不被视为空列?
  • @Sunil,从列名可以看出,这些列是用户定义的,留空。但是 Column6、Column7、Column8 由于是空列。
  • 尝试使用 microsoft.ace.oledb 而不是 OpenXMl 库。那么你可能没有这个问题
  • @T.S.是的,这将解决问题,但现在无法切换到 oledb

标签: c# excel datatable excel-reader


【解决方案1】:

你可以使用这个扩展:

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

如果要从给定索引开始,请将其传递给方法。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2011-06-06
    • 2017-01-15
    • 2018-09-21
    相关资源
    最近更新 更多