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 看看,也非常歡迎各位給我提 feature request 或好的改進建議
Reference
- https://github.com/WeihanLi/WeihanLi.Npoi
- https://www.nuget.org/packages/WeihanLi.Npoi/
- https://github.com/WeihanLi/WeihanLi.Npoi/issues/79
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/52285.html
標籤:.NET Core
上一篇:跨應用程式域,將DLL中的控制元件加載到Form報錯:遠程處理無法在型別 Control 上找到欄位 parent
