如何获取 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'.
我有一个包含 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'.