[英]Can NPOI Mapper set the row number
我目前在 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 頁面上的文檔,聽起來我應該使用自定義解析器,但我看不到如何訪問行號作為其中的一部分?
我查看了 github 上的Mapper.cs ,我意識到RowInfo和IRowInfo類(保存行號)僅用於公共方法的返回。
在擴展文件夾中,我在EnumerableExtensions類中找到了一個名為ForEach<T>
的IEnumerable<T>
的 ExtensionMethod,它可以用作當前代碼的替代方法。
這是一個未經測試的解決方案。
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
和RowNumber
的接口或基類型。 基礎類型的防爆:
public class MyPocoFromExcelBase
{
public string FileName { get; set; }
public int RowNumber { get; set; }
}
2) 在MyPocoClass
和任何其他代表 Excel 文件中的行的類上繼承MyPocoFromExcelBase
。
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");
這樣你就不需要在你的代碼中重寫這個邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.