首页 > 解决方案 > ExcelMapper - 根据条件跳过行

问题描述

读取包含财务数据的 excel 文件并使用 ExcelMapper 将其映射到对象。

    public static async IAsyncEnumerable<TReceipt> ReadBankEntry(string file)
    {
        using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.ReadWrite))
        {
            ExcelMapper mapper = new ExcelMapper() 
            { 
                HeaderRowNumer = 0 // zero is the default
                MinRowNumber = 2 // actual data starts from here (skipping row=1)
                // MaxRowNumber = ? this is dynamic and can change in every excel file.
            };
            // my mapping table here
            foreach (TReceipt bankEntry in await mapper.FetchAsync<TReceipt>(stream, "Sheet1"))
            {
                yield return bankEntry;
            }
        };
    }

文件中的最后 3 行包含我不需要的信息,并且还包含某些列中的字符串值,这些列应该只包含十进制类型,这最终会引发异常。从这一行开始,有些列也是空的。

例子 -

+----+-----------------+--------------+
| SL |      Date       |      P1      |
+----+-----------------+--------------+
|    | Opening Balance | USD 10254.66 |
|  1 | 01-07-2020      | 445.25       |
|  2 | 01-07-2020      | 234.80       |
|  3 | 02-07-2020      | 13.00        |
|    | Total           | USD 10947.71 |
+----+-----------------+--------------+

我想在数据到达这条线后停止读取数据。如何使用 ExcelMapper 做到这一点?

编辑:任何其他具有类似功能的库都可以。请注意,文件将具有 xls 扩展名(旧格式)。

标签: c#.netexcel.net-corepoco

解决方案


在向 ExcelMapper 的创建者 Michael Ganss 提出问题后;他说(链接)-

如果映射没有产生任何错误,我可能会使用经典.Where()(或.TakeWhile())来处理这个问题。否则,您可以尝试使用自定义映射方法来避免任何错误,然后进行过滤。

如果您事先知道行的范围,您可以使用数据行范围属性

我希望有一种内置的方法来处理类型不正确的行,以避免在捕获所有数据点后由于过滤而导致性能下降(超过 100000 行),但与其他库相比,这仍然是具有可读代码的最快库。


推荐阅读