zoukankan      html  css  js  c++  java
  • 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 看看,也非常欢迎各位给我提 feature request 或好的改进建议

    Reference

  • 相关阅读:
    while循环和do while循环的基本使用和区别
    less框架简介
    css关联选择器大致类型总结
    渐进增强和优雅降级
    行,行内元素与块级元素有什么不同?
    for循环的大概遍历运用
    JDBC连接mysql数据库并进行简单操作
    Java实现杨辉三角
    replaceAll() 方法
    java抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/weihanli/p/13663897.html
Copyright © 2011-2022 走看看