簡體   English   中英

NPOI Mapper可以設置行號嗎

[英]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 ,我意識到RowInfoIRowInfo類(保存行號)僅用於公共方法的返回。

在擴展文件夾中,我在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) 創建包含屬性FilenameRowNumber的接口或基類型。 基礎類型的防爆:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM