【愚公系列】2023年04月 .NET CORE工具案例-.NET Core使用ExcelMapper

前言

ExcelMapper 是一个基于 MIT 协议的开源组件,通过操作 C# 中的数据模型来进行 Excel 的读取和写入。它提供了非常简洁的 API,甚至可以通过一行代码读取或写入 Excel 数据。

核心功能

  • 读取和写入 Excel 文件
  • 使用纯托管 NPOI 库而不是 Jet 数据库引擎(NPOI 用户组)
  • 使用标题行(列名)或列索引(无标题行)映射到 Excel 文件
  • 映射嵌套对象(父/子对象)
  • 阅读时可选择跳过空白行
  • 保存回文件时保留格式
  • (可选)让映射器跟踪对象
  • 通过约定、属性或方法调用将列映射到属性
  • 对数字列和日期时间列使用自定义或内置数据格式
  • 根据属性类型映射公式或公式结果
  • 映射 JSON
  • 获取/保存动态对象
  • 使用记录
  • 提供自定义对象工厂

GitHub网址:github.com/mganss/Exce… 在这里插入图片描述

一、.NET Core使用ExcelMapper

1.使用 Nuget 搜索并安装 ExcelMapper

在这里插入图片描述

2.从Excel文件中读取对象

var products = new ExcelMapper("products.xlsx").Fetch<Product>();
复制代码
public class Product
{
  public string Name { get; set; }
  public int NumberInStock { get; set; }
  public decimal Price { get; set; }
}
复制代码

在这里插入图片描述

在这里插入图片描述

3.属性映射

3.1 映射到特定列名称

public class Product
{
  public string Name { get; set; }
  [Column("Number")]
  public int NumberInStock { get; set; }
  public decimal Price { get; set; }
}
复制代码

3.2 映射到列索引

public class Product
{
    [Column(1)]
    public string Name { get; set; }
    [Column(Letter="C")]
    public int NumberInStock { get; set; }
    [Column(4)]
    public decimal Price { get; set; }
}

var products = new ExcelMapper("products.xlsx") { HeaderRow = false }.Fetch<Product>();
复制代码

请注意,列索引不需要是连续的。映射到列索引时,需要通过属性或方法显式映射每个属性。您可以将列索引与列名组合在一起,以指定显式列顺序,同时仍使用标题行。

3.3 通过方法调用映射

除了在实体类上加特性的方式,ExcelMapper 还支持使用代码的方式手动映射,如下

var excel = new ExcelMapper("products.xls");
excel.AddMapping<Product>("Number", p => p.NumberInStock);
excel.AddMapping<Product>(1, p => p.NumberInStock);
excel.AddMapping(typeof(Product), "Number", "NumberInStock");
excel.AddMapping(typeof(Product), ExcelMapper.LetterToIndex("A"), "NumberInStock");
复制代码

3.4 多个映射

您可以将单个列映射到多个属性,但您需要了解从对象映射回 Excel 时应发生的情况。若要指定要映射回 Excel 的单个属性,请添加映射到同一列的所有其他属性的属性。或者,可以在通过方法调用进行映射时使用该方法。

public class Product
{
    public decimal Price { get; set; }
    [Column("Price", MappingDirections.ExcelToObject)]
    public string PriceString { get; set; }
}

// or

excel.AddMapping<Product>("Price", p => p.PriceString).FromExcelOnly();
复制代码

Column默认情况下,属性是继承的,如果将属性添加到 Base 中的属性,则会导致单个重写属性的多个映射 和派生类。若要防止出现这种情况,请在基类中的属性上将该属性设置为 false。

3.5 动态映射

你可以不定义实体类,直接使用 dynamic 类型获取数据,如下

var products = new ExcelMapper("products.xlsx").Fetch(); // -> IEnumerable<dynamic>
products.First().Price += 1.0;
复制代码

3.6 忽略属性

public class Product
{
    public string Name { get; set; }
    [Ignore]
    public int Number { get; set; }
    public decimal Price { get; set; }
}

// or

var excel = new ExcelMapper("products.xlsx");
excel.Ignore<Product>(p => p.Price);
复制代码

3.7 特定数据格式

public class Product
{
    [DataFormat(0xf)]
    public DateTime Date { get; set; }

    [DataFormat("0%")]
    public decimal Number { get; set; }
}
复制代码

更多属性使用清参考官网

4.写入 Excel 文件

1、纯写入

var products = new List<Product>
{
    new Product { Name = "Nudossi", NumberInStock = 60, Price = 1.99m },
    new Product { Name = "Halloren", NumberInStock = 33, Price = 2.99m },
    new Product { Name = "Filinchen", NumberInStock = 100, Price = 0.99m },
};

new ExcelMapper().Save("products.xlsx", products, "Products");
复制代码

在这里插入图片描述

2、读取写入

var products = new ExcelMapper("products.xlsx").Fetch<Product>().ToList();
products[1].Price += 1.0m;
excel.Save("products.out.xlsx");
复制代码

3、JSON 支持

你可以非常方便的把 Excel 中的数据映射到 Json 类型中,通过使用 Json 特性或者 AsJson 方法,如下

public class ProductJson
{
    [Json]
    public Product Product { get; set; }
}

// or

var excel = new ExcelMapper("products.xls");
excel.AddMapping<ProductJson>("Product", p => p.Product).AsJson();
复制代码

猜你喜欢

转载自juejin.im/post/7222305855978176569