gpt4 book ai didi

c# - NPOI Mapper可以设置行号吗

转载 作者:行者123 更新时间:2023-12-01 14:44:50 28 4
gpt4 key购买 nike

我目前正在使用 c# 中的 npoi.mapper 将 excel 文件读入 poco 类以进行进一步处理,并且一切正常。

系统已经发展壮大,多个电子表格经常并行处理,因此我想在我的 poco 类中包含文件名和行号以用于调试目的。

到目前为止,我只是在 for 循环中手动添加了文件名和行号,但想知道我是否可以通过让 npoi.mapper 为我执行此操作来重构和清理我的代码?

这是我的代码:

   var mapper = new Mapper(excelStream);
var rows = mapper.Take<MyPocoClass>("Sheet2");

for(int i = 0; i < rows.Length; i++)
{
var row = rows[i];

row.Filename = excelName;
row.RowNumber = i;
}

我已经阅读了关于 GitHub Page 的文档听起来我应该使用自定义解析器,但我看不到如何访问其中的行号?

最佳答案

我看一下 Mapper.cs在 github 上,我意识到 RowInfoIRowInfo类(包含行号)仅用于公共(public)方法的返回。

在扩展文件夹中,我发现了 IEnumerable<T> 的扩展方法称为 ForEach<T>在类里面EnumerableExtensions可以用作您当前代码的替代方案。

这是一个未经测试的解决方案。

   var mapper = new Mapper(excelStream);
var rows = mapper.Take<MyPocoClass>("Sheet2");

rows.Foreach<RowInfo<MyPocoClass>>(row => {
row.Value.Filename = "Sheet2";
row.Value.RowNumber = row.RowNumber;
});

这只是您当前代码的一个静态糖。


在我看来,完成此类工作的最佳方法是遵循以下步骤:

1) 创建一个包含属性 Filename 的接口(interface)或基类型和 RowNumber .基本类型示例:

public class MyPocoFromExcelBase 
{
public string FileName { get; set; }

public int RowNumber { get; set; }
}

2) 继承MyPocoFromExcelBase在你的 MyPocoClass以及代表 Excel 文件中一行的任何其他类。

3) 为 IEnumerable<RowInfo<MyPocoFromExcelBase>> 创建扩展方法并做映射:

    public static void MapRowNumber(this IEnumerable<RowInfo<MyPocoFromExcelBase>> sequence, string fileName)
{
if (sequence == null) return;

foreach (var item in sequence)
{
item.Value.Filename = fileName;
item.Value.RowNumber = item.RowNumber;
}
}

4) 然后你可以在任何映射器中做这样的事情:

var mapper = new Mapper(excelStream);
var rows = mapper.Take<MyPocoClass>("Sheet2");
rows.MapRowNumber("Sheet2");

这样您就不需要在整个代码中重写此逻辑。

关于c# - NPOI Mapper可以设置行号吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250211/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com