1. 程式人生 > 實用技巧 >WeihanLi.Npoi 1.10.0 更新日誌

WeihanLi.Npoi 1.10.0 更新日誌

WeihanLi.Npoi 1.10.0 更新日誌

Intro

上週有個網友希望能夠匯入Excel時提供一個 EndRowIndex 來自己控制結束行和根據欄位過濾的,週末找時間做了一下這個 feature,並且解決了一個 Csv 匯入的一個痛點,下面再具體介紹

EndRowIndex

SheetSetting 增加 EndRowIndex 以為了提前結束資料讀取,比如說只讀 TOP 100 條資料或者有一部分資料屬於是不相關的垃圾資料,我們就可以利用這個配置來避免做一些不必要的資料讀取(目前只對 Excel 匯入生效)

DataValidation

一直沒有做資料校驗的功能,之前我的做法通常時匯入到一個 list 然後再過濾掉不符合要求的資料,這樣做有些繁瑣而且增加記憶體消耗,在這個版本中增加了資料校驗的功能,使用者可以設定一個委託來校驗資料是否合法,如果匯入的資料不合法則不會返回,只有合法的資料才會返回。(Csv 和 Excel 匯入有效)

使用示例可以參考下面的單元測試

[Theory]
[InlineData(ExcelFormat.Xls)]
[InlineData(ExcelFormat.Xlsx)]
public void DataValidationTest(ExcelFormat excelFormat)
{
    IReadOnlyList<Notice> list = Enumerable.Range(0, 10).Select(i => new Notice()
    {
        Id = i + 1,
        Content = $"content_{i}",
        Title = $"title_{i}",
        PublishedAt = DateTime.UtcNow.AddDays(-i),
        Publisher = $"publisher_{i}"
    }).ToArray();
    var excelBytes = list.ToExcelBytes(excelFormat);

    var settings = FluentSettings.For<Notice>();
    lock (settings)
    {
        settings.WithDataValidation(x => x.Id > 5);

        var importedList = ExcelHelper.ToEntityList<Notice>(excelBytes, excelFormat);
        Assert.Equal(list.Count(x => x.Id > 5), importedList.Count);

        int i = 0, k = 0;
        while (list[k].Id != importedList[i].Id)
        {
            k++;
        }

        for (; i < importedList.Count; i++, k++)
        {
            if (list[k] == null)
            {
                Assert.Null(importedList[i]);
            }
            else
            {
                Assert.Equal(list[k].Id, importedList[i].Id);
                Assert.Equal(list[k].Title, importedList[i].Title);
                Assert.Equal(list[k].Content, importedList[i].Content);
                Assert.Equal(list[k].Publisher, importedList[i].Publisher);
                Assert.Equal(list[k].PublishedAt.ToStandardTimeString(), importedList[i].PublishedAt.ToStandardTimeString());
            }
        }

        settings.WithDataValidation(null);
    }
}

Csv new() constraint

Csv 匯入移除了 new() 限制,這樣解決了之前的一個痛點,就是當匯入型別為 string 的時候,沒辦法直接匯入,需要新增一個 model,包含一個 string 型別的屬性,如此太麻煩了, new() 限制移除之後就可以直接匯入為 List<string> 了,不再需要再建一個臨時類了

var list = CsvHelper.ToEntityList<string>();

More

最近想把 Entity 配置的 Mapping 這種方式抽象出來,適用於所有需要對映關係配置的場景

Excel 做一層抽象,基於 NPOI 實現一套,基於 Epplus 實現一套,也可以基於 OpenXML 實現

以後有需要對 Word 或其他的需要,也可以像 Excel 一樣,先做一層抽象,再根據相應的 Package 做實現即可

一直覺得有些糾結,如果這樣子改了專案名叫 WeihaLi.Npoi 就不合適了,還沒想好專案怎麼命名,後面想好了,再新建專案或專案重新命名吧,目前改了一部分,放在 vnext 分支上了,有興趣的童鞋可以到 Github 看

Reference