上周有个网友希望能够导入Excel时提供一个 EndRowIndex
来自己控制结束行和根据字段过滤的,周末找时间做了一下这个 feature,并且解决了一个 Csv 导入的一个痛点,下面再具体介绍
SheetSetting
增加 EndRowIndex
以为了提前结束数据读取,比如说只读 TOP 100 条数据或者有一部分数据属于是不相关的垃圾数据,我们就可以利用这个配置来避免做一些不必要的数据读取(目前只对 Excel 导入生效)
一直没有做数据校验的功能,之前我的做法通常时导入到一个 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);
}
}
new()
constraintCsv 导入移除了 new()
限制,这样解决了之前的一个痛点,就是当导入类型为 string
的时候,没办法直接导入,需要添加一个 model,包含一个 string 类型的属性,如此太麻烦了, new()
限制移除之后就可以直接导入为 List<string>
了,不再需要再建一个临时类了
var list = CsvHelper.ToEntityList<string>();
最近想把 Entity 配置的 Mapping 这种方式抽象出来,适用于所有需要映射关系配置的场景
Excel 做一层抽象,基于 NPOI 实现一套,基于 Epplus 实现一套,也可以基于 OpenXML 实现
以后有需要对 Word 或其他的需要,也可以像 Excel 一样,先做一层抽象,再根据相应的 Package 做实现即可
一直觉得有些纠结,如果这样子改了项目名叫 WeihaLi.Npoi
就不合适了,还没想好项目怎么命名,后面想好了,再新建项目或项目重命名吧,目前改了一部分,放在 vnext 分支上了,有兴趣的童鞋可以到 Github 看
原文:https://www.cnblogs.com/weihanli/p/13663897.html