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
new()
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
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。