如何获取 LinqToExcel 异常处理行的行信息?

How to get row info of Exception handled row for LinqToExcel?

我有一个包含 3 列的 excel 文件。所以我创建了一个如下所示的模型来投射行。

public class Point
{
    [ExcelColumn("Lon")]
    public float Lon {get;set;}

    [ExcelColumn("Lat")]
    public float Lat {get;set;}

    [ExcelColumn("Elevation")]
    public float Elevation {get;set;}
}

var excel = new ExcelQueryFactory("points.xlsx");
var ic= from c in excel.Worksheet<Point>();

样本excel

Lon    Lat    Elevation
---    ---    ---------
11.5   25.6   80.56
12ab   89.87  14.83
1.7    5.8    9.3

但有时用户可能会输入错误的数据。例如,第二行的 Lon 值为“12ab”。在这种情况下抛出异常。

我如何了解哪一行和哪一个单元格失败了?

不是您真正想要的,但也许对您来说已经足够了。

无法找到当前版本库的方法,但我做了以下操作

static void Main(string[] args)
{
    var f = Path.Combine(AppContext.BaseDirectory, "points.xlsx");
    var excel = new ExcelQueryFactory(f);
    excel.AddTransformation<Point>(x => x.Lon, x => float.TryParse(x, out var y) ? y : -1);
    excel.AddTransformation<Point>(x => x.Lat, x => float.TryParse(x, out var y) ? y : -1);
    excel.AddTransformation<Point>(x => x.Elevation, x => float.TryParse(x, out var y) ? y : -1);

    int rowNumber = 0;
    try
    {
        foreach (var row in excel.Worksheet<Point>())
        {
            if (row.Lon == -1 ||
                row.Lat == -1 ||
                row.Elevation == -1)
            {
                throw new FormatException();
            }

            rowNumber++;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Failed at {rowNumber}");
        Console.WriteLine(ex.Message);
    }

    Console.WriteLine("Done");
    Console.ReadLine();
}

如果您不介意使用“预发布”版本 https://www.nuget.org/packages/LinqToExcel/2.0.0-PRERELEASE-2

你可以这样做:

var f = Path.Combine(AppContext.BaseDirectory, "points.xlsx");
var excel = new ExcelQueryFactory(f);
excel.Lazy = true;

int rowNumber = 0;
try
{
    foreach (var row in excel.Worksheet<Point>())
    {
        rowNumber++;
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Failed at {rowNumber}");
    Console.WriteLine(ex.Message);
}

这使用了“Lazy”功能,该功能于 2018 年 10 月包含在内,但到目前为止还没有发布 NuGet 包。 https://github.com/paulyoder/LinqToExcel/pull/155

在预发布版本中,您实际上甚至不需要手动计数 rowNumber,因为有第二个代码更改对您来说很方便,它也从未在最终版本中发布, https://github.com/paulyoder/LinqToExcel/pull/125(自 2017 年 10 月起)

所以您需要做的就是:

var f = Path.Combine(AppContext.BaseDirectory, "points.xlsx");
var excel = new ExcelQueryFactory(f);

try
{
    foreach (var row in excel.Worksheet<Point>())
    {

    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

你会得到新的和改进的异常,说明如下:

Error on row 3 and column name 'Lon'.