首页 > 其他 > 详细

WeihanLi.Npoi 1.10.0 更新日志

时间:2020-09-15 22:54:12      阅读:71      评论:0      收藏: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

WeihanLi.Npoi 1.10.0 更新日志

原文:https://www.cnblogs.com/weihanli/p/13663897.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!