经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET Core 使用NPOI读取Excel返回泛型List集合
来源:cnblogs  作者:_小渣渣  时间:2019/11/8 18:43:56  对本文有异议

我是一名 ASP.NET 程序员,专注于 B/S 项目开发。累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html

 

网上有很多关于npoi读取excel表格的例子,很多都是返回一个Datatable的对象,但是我需要的是一个list集合,这里就需要把Datatable转成自己需要的List集合,所以,我封装了一个方法,传入class对象就能返回相应的list对象。

首先先看效果图,如下:

 

 

模板

一共有4列,有很多行,其中只有2行有数据,如下图:

 

特性

首先,定义一个特性,意义是对象的属性对应表格的哪一列,代码如下:

public class ColumnAttribute: Attribute
    {
        public ColumnAttribute(int index)
        {
            Index = index;
        }
        public int Index { get; set; }
    }

  

对象模型

将表格数据读取出来,转换成相应的对象集合,在对象的属性标注上面定义的特性,代码如下:

public class TestModel
    {
        [Column(0)]
        public string Name { get; set; }
        [Column(1)]
        public string Url { get; set; }
        [Column(2)]
        public string Date { get; set; }
        [Column(3)]
        public string Remark { get; set; }
    }

  

封装的方法

nuget安装npoi:

Install-Package DotNetCore.NPOI -Version 1.2.2

代码如下:

public class ExcelHelper
    {
        /// <summary>
        /// 读取excel转换成list集合
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="stream">文件流</param>
        /// <param name="startIndex">从第几行开始读取</param>
        /// <param name="sheetIndex">读取第几个sheet</param>
        /// <returns></returns>
        public static IList<T> GetList<T>(Stream stream, int startIndex, int sheetIndex = 0)
            where T : class
        {
            IList<T> ts = new List<T>();
            try
            {
                IWorkbook workbook = WorkbookFactory.Create(stream);
                var sheet = workbook.GetSheetAt(sheetIndex);
                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    //一行最后一个cell的编号 即总的列数
                    int cellCount = firstRow.LastCellNum;
                    //最后一列的标号
                    int rowCount = sheet.LastRowNum;
                    for (int i = startIndex; i <= rowCount; ++i)
                    {
                        //获取行的数据
                        IRow row = sheet.GetRow(i);
                        if (row == null) continue; //没有数据的行默认是null       
                        {
                            T model = Activator.CreateInstance<T>();
                            for (int j = row.FirstCellNum; j < cellCount; ++j)
                            {
                                if (row.GetCell(j) != null)
                                {
                                    var rowTemp = row.GetCell(j);
                                    string value = null;
                                    if (rowTemp.CellType == CellType.Numeric)
                                    {
                                        short format = rowTemp.CellStyle.DataFormat;
                                        if (format == 14 || format == 31 || format == 57 || format == 58 || format == 20)
                                            value = rowTemp.DateCellValue.ToString("yyyy-MM-dd");
                                        else
                                            value = rowTemp.NumericCellValue.ToString();
                                    }
                                    else
                                        value = rowTemp.ToString();
                                    //赋值
                                    foreach (System.Reflection.PropertyInfo item in typeof(T).GetProperties())
                                    {
                                        var column = item.GetCustomAttributes(true).First(x => x is ColumnAttribute) as ColumnAttribute;
                                        if (column.Index == j)
                                        {
                                            item.SetValue(model, value);
                                            break;
                                        }
                                    }
                                }
                            }
                            ts.Add(model);
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (stream != null) stream.Close();
            }
            return ts;
        }
    }

  

调用代码:

static void Main(string[] args)
        {

            FileStream fs = new FileStream(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "/test.xlsx", FileMode.Open, FileAccess.Read);
            var temp = ExcelHelper.GetList<TestModel>(fs, 3);
            var json1 = Newtonsoft.Json.JsonConvert.SerializeObject(temp.Where(x => !string.IsNullOrWhiteSpace(x.Name)).ToList());
            Console.WriteLine(json1);
            Console.WriteLine("ok");
            Console.ReadKey();
        }

  最后,就出现了文章最开始的效果图。

 

转载于:https://down.itsvse.com/k/0tmhog.html

原文链接:http://www.cnblogs.com/itsvse/p/11821503.html

ASP.net热门文章

  • .NET Core 傻瓜式CSRedisCore缓存
  • .net core部署到linux可能碰到的问题
  • ASP.Net Core Razor+AdminLTE 小试牛刀
  • Asp.Net Core中使用NLog记录日志
  • net core 使用 SqlSugar
  • 前后端分离,https站点无法通过Ajax访问http资源(Mixed Content,The page at &#39;https://xxx.com&#39; was loaded over HTTPS)
  • .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)
  • [AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)
  • 在ASP.NET Core中使用托管启动(hosting startup)程序集,实现批量注册service
  • NETCore项目报错 An error occurred while starting the application

  • ASP.net推荐文章

  • Asp.Net Core 单元测试正确姿势
  • 建议收藏:.net core 使用EPPlus导入导出Excel详细案例,精心整理源码已更新至开源模板
  • 【翻译】使用WebApi和Asp.Net Core Identity 认证 Blazor WebAssembly(Blazor客户端应用)
  • (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)
  • c#中关于string的特性介绍以及注意事项
  • 框架搭建与EF常用基类实现
  • 【翻译】配置基于角色的Blazor WebAssembly(Blazor客户端)应用程序的授权
  • .NET Core 又一杀器! Web Blazor框架横空出世!
  • abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理七(二十五)
  • 务必收藏备用:.net core中通过Json或直接获取图形验证码(数字验证码、字母验证码、混合验证码),有源代码全实战demo(开源代码.net core3.0)