[Npoi]Npoi导入Excel, 转为Entity

Npoi导入Excel其实只要读成DataTable就可以随意操作了, 比如转为Entity…

By: 胖纸不争
NetCore🐧群: 743336452

核心代码:

public class ExcelImport
{
    public string FilePath { get; set; }
    public string SheetName { get; set; }

    private DataTable _dataTable;

    ///
    /// 初始化文件路径和Sheet名称
    ///
    ///
    ///
    public ExcelImport(string filePath, string sheetName = "Sheet1")
    {
        FilePath = filePath;
        SheetName = sheetName;
    }

    ///
    /// 转为指定类型
    ///
    ///
    ///
    public List ToList() where T : IExcelStruct
    {
        if (_dataTable is null) ToDataTable();

        var list = new List();
        var type = typeof(T);
        var properties = type.GetProperties();
        foreach (DataRow row in _dataTable.Rows)
        {
            var t = Activator.CreateInstance();
            foreach (var property in properties)
            {
                var prop_name = property.GetCustomAttribute().Name;
                var value = row[prop_name];
                if (value != DBNull.Value)
                {
                    var d = Convert.ChangeType(value, property.PropertyType);
                    property.SetValue(t, d);
                }
            }
            list.Add(t);
        }
        return list;
    }

    ///
    /// Excel转为DataTable
    ///
    ///
    private ExcelImport ToDataTable()
    {
        _dataTable = new DataTable();
        using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
        {
            var workbook = WorkbookFactory.Create(fs);
            var sheet = workbook.GetSheet(SheetName);
            if (sheet == null)
            {
                throw new Exception("Excel sheet not found");
            }

            var headerRow = sheet.GetRow(0);
            var headerRowCount = headerRow.LastCellNum;
            for (var i = headerRow.FirstCellNum; i < headerRowCount; i++)
            {
                var column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                _dataTable.Columns.Add(column);
            }

            var rowCount = sheet.LastRowNum;
            for (var i = sheet.FirstRowNum + 1; i

Powers.NpoiExcel

Now Support: Import Excel to Entity

1: Create your entity

public class User : IExcelStruct
{
    [ExcelColumn(Name = "姓名")]
    public string Name { get; set; }

    [ExcelColumn(Name = "年龄")]
    public int Age { get; set; }

    [ExcelColumn(Name = "性别")]
    public string Gender { get; set; }

    [ExcelColumn(Name = "生日")]
    public DateTime Born { get; set; }
}

2: How to use

var path = Environment.CurrentDirectory + "/files/test.xlsx";

var data = new ExcelImport(path).ToList();

_testOutputHelper.WriteLine("姓名\t年龄\t性别\t生日");

foreach (var item in data)
{
    _testOutputHelper.WriteLine($"{item.Name}\t{item.Age}\t{item.Gender}\t{item.Born}");
}

3: Result or run xUnit.Test

 Powers.NpioExcel.TestProject.ExcelTests.Test1
   持续时间: 244 毫秒

  标准输出: 
    姓名  年龄  性别  生日
    张三  20  男   2022/5/1 0:00:00
    李四  21  女   2022/5/2 0:00:00
    王五  22  男   2022/5/3 0:00:00
    赵六  23  女   2022/5/4 0:00:00
    田七  24  男   2022/5/5 0:00:00
    老八  25  女   2022/5/6 0:00:00
    小汉堡 26  男   2022/5/7 0:00:00
    奥里给 27  女   2022/5/8 0:00:00
    嘿嘿嘿 28  男   2022/5/9 0:00:00

Original: https://www.cnblogs.com/donpangpang/p/16315605.html
Author: 胖纸不争
Title: [Npoi]Npoi导入Excel, 转为Entity

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590953/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java.sql.SQLException: The server time zone value is unrecognized

    在写Mysql数据库连接工具的时候出现了这样的报错,其实原因写的挺清楚的 就是在连接的时候没有加上时区的信息; 解决办法就是在JDBC连接的URL里面加上serverTimezon…

    数据库 2023年6月6日
    081
  • navicat~导出数据库密码

    当我们mysql密码忘记了,而在navicat里有记录,我们应该如何导出这个密码呢? 第一步:文件菜单,导出链接,导出连接获取到 connections.ncx 文件 这里需要勾选…

    数据库 2023年5月24日
    0175
  • Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 代码仓库: https://github.com/Rain-with-me/JavaStudyCode/tree…

    数据库 2023年6月14日
    096
  • Win10系统链接蓝牙设备

    进入设备界面,删除已有蓝牙,如果蓝牙耳机已经链接其他设备,先断开链接 点击添加蓝牙或其他设备 Original: https://www.cnblogs.com/itcaimeng…

    数据库 2023年6月11日
    084
  • 记一次故障系列:docker 启动失败

    启动报错: csharp;gutter:true; ]# systemctl start docker Job for docker.service failed because …

    数据库 2023年6月9日
    073
  • MySQL特性:MRR,Multi-Range Read,多范围读

    孔个个MRR在5.6版本开始支持,相关文章不少。但是读起来层次感差了一些,在这里我用自己的理解重新整理了一版。这里参考了很多在网络上能找到的资料,才使我更全面的理解MRR,但时间有…

    数据库 2023年6月16日
    051
  • Java面试题(九)–Spring MVC

    1、Spring MVC中的拦截器和Servlet中的filter有什么区别? 过滤器:依赖于servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤 拦截器:依赖于w…

    数据库 2023年6月16日
    072
  • MySQL数据库索引介绍

    一、什么是索引 索引是mysql数据库中的一种数据结构,就是一种数据的组织方式,这种数据结构又称为key 表中的一行行数据按照索引规定的结构组织成了一种树型结构,该树叫B+树 二、…

    数据库 2023年5月24日
    066
  • Selenium 4 有哪些不一样?

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/d59b986c.html 你好,我是测试蔡坨坨。 众所周知,Selenium在2021年10月13号发…

    数据库 2023年6月11日
    083
  • SQL与数据库编程学习笔记-day2

    SQL与数据库编程学习笔记-day2 修改数据库密码; – 登出数据库(修改数据库密码必须在数据库外执行命令); * – Ps:登出命令:quit* 操作完…

    数据库 2023年5月24日
    060
  • Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块 os.access()方法

    Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块 os.access()方法 stat模块描述了os.stat(filename)…

    数据库 2023年6月9日
    067
  • mysql常用操作汇总

    工作中经常用会遇到这种情况,可以访问mysql所在的服务器,但是服务器端口不对外暴露(通常因为安全原因)。这时,操作数据库只能通过命令行和 mysql client窗口来实现。我对…

    数据库 2023年6月14日
    083
  • UniApp文件上传(SpringBoot+Minio)

    UniApp文件上传(SpringBoot+Minio) 一、Uni文件上传 (1)、文件上传的问题 UniApp文件上传文档 uni.uploadFile({ url: ‘htt…

    数据库 2023年6月6日
    086
  • 2022-8-17 mysql 第三天

    子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果集有一行多列 表子查询:结果集多行…

    数据库 2023年6月14日
    073
  • postman自动化测试

    postman做接口的自动化测试case 记录一次自动化测试的工作,以及该过程中对于测试设计的一些思考。 postman工具 简单介绍,这个工具无论是开发还是测试,使用来调试接口的…

    数据库 2023年6月6日
    0112
  • 数据库操作

    数据库操作 数据库基础数据库是一种 存储结构, 允许使用各种格式 输入、处理、检索 数据,且不用在每次需要数据时 重新输入数据。 select 语句: select语句 用于查询数…

    数据库 2023年6月16日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球