1

我正在使用 LinqToExcel 将 Excel 行映射到 C#/.NET 项目中的对象。

我将验证代码放在我的转换函数中,这样它们不仅可以转换数据,而且还可以在丢失某些数据时警告用户。例子:

excel.AddTransformation<PaymentObject>(x => x.PaymentPeriod, cellvalue =>
{
    if (cellvalue.Length == 0)
    {
        throw new Exception(String.Format(Errors.EmptyField, ColumnNames.PaymentPeriod, ColumnNames.EmployeeNumber, lastCheckedEmployeeNumber));
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(cellvalue);
});

但是,我不希望 Excel 有时在底部添加的空行触发此验证(请参阅LinqToExcel 空白行)。

我的问题是我不能使用那里提到的解决方案,因为在调用类似的东西时我无法访问原始行数据

excel.Worksheet<SomeType>("WorksheetName").Where(row => row.Any(cell => cell != null));

这是因为首先应用了转换,而 Where 方法将应用于转换结果。

另外 - 在转换函数中,我无法访问行中的其他值,所以我无法检查它是单个空单元格(错误)还是行完全为空。

是否可以在应用转换之前过滤掉空行?

4

2 回答 2

3

您可以将强类型工作表与无类型工作表连接起来,然后使用无类型工作表查找完全空白的行:

List<T> onlyNonBlankRows = _queryFactory.Worksheet<T>(firstWorksheetWithColumnHeaders)
    // calling ToList here is workaround to avoid Remotion.Data.Linq.Parsing.ParserException for Select((item,index) => ...) - "This overload of the method 'System.Linq.Queryable.Select' is currently not supported, but you can register your own parser if needed."
    .ToList()
    .Select((typedRow, index) => new { typedRow, index })
    // Join the worksheet to an untyped projection of the same worksheet so that we can find totally blank rows
    .Join(
        _queryFactory.Worksheet(firstWorksheetWithColumnHeaders)
    // calling ToList here is workaround to avoid Remotion.Data.Linq.Parsing.ParserException for Select((item,index) => ...)
                    .ToList()
                    .Select(
                        (untypedRow, indexForUntypedRow) =>
                        new { untypedRow, indexForUntypedRow }),
    // join on row index - row 1 matches row 1 etc
        arg => arg.index, arg => arg.indexForUntypedRow,
        (a, b) => new { a.index, a.typedRow, b.untypedRow })
    // Exclude rows where all cells are empty 
    .Where(x => x.untypedRow.Any(cell => cell.Value != DBNull.Value))
    .Select(joined => joined.typedRow).ToList();
于 2013-10-11T18:52:01.760 回答
0

只有当整行为空白时,是否有一些单元格为空白?

例如,除了空白行之外,通常有一个始终填充的 Id 列。如果是这种情况,那么以下查询应该适合您。

//assuming Id cell is only blank when the whole row is blank
excel.WorkSheet<PaymentObject>().Where(x => x.Id != "");

//the Id cell might be null instead of blank, so use this Where clause instead
excel.WorkSheet<PaymentObject>().Where(x => x.Id != null);
于 2013-04-05T20:26:52.930 回答