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 看