欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net Core 使用 NPOI 导入Excel

程序员文章站 2022-06-22 15:13:46
由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出: /// /// Excel导入帮助类 /// public class ImportExcelUtil where T : new() { //合法文件扩展名 p ......

由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出:

/// <summary>
   /// excel导入帮助类
   /// </summary>
    public class importexcelutil<t> where t : new()
    {
        //合法文件扩展名
        private static list<string> extname = new list<string>() { ".xls", ".xlsx" };
        /// <summary>
        /// 导入excel内容读取到list<t>中
        /// </summary>
        /// <param name="file">导入execl文件</param>
        /// <param name="sheetname">指定读取excel工作薄sheet的名称</param>
        /// <returns>list<t></returns>
        public static list<t> inputexcel(iformfile file, string sheetname = null)
        {
            //获取文件后缀名
            string type = path.getextension(file.filename);
            //判断是否导入合法文件
            if(!extname.contains(type))
            {
                return null;
            }
            //转成为文件流
            memorystream ms = new memorystream();
            file.copyto(ms);
            ms.seek(0, seekorigin.begin);
            //实例化t数组
            list<t> list = new list<t>();
            //获取数据
            list = inputexcel(ms, sheetname);
            return list;
        }

        /// <summary>
        /// 将excel文件内容读取到list<t>中
        /// </summary>
        /// <param name="filename">文件完整路径名</param>
        /// <param name="sheetname">指定读取excel工作薄sheet的名称</param>
        /// <param name="isfirstrowcolumn">第一行是否是datatable的列名:true=是,false=否</param>
        /// <returns>list<t></returns>
        public static list<t> inputexcel(string filename, string sheetname = null)
        {
            if (!file.exists(filename))
            {
                return null;
            }
            //根据指定路径读取文件
            filestream fs = new filestream(filename, filemode.open, fileaccess.read);
            //实例化t数组
            list<t> list = new list<t>();
            //获取数据
            list = inputexcel(fs, sheetname);

            return list;
        }

        /// <summary>
        /// 将excel文件内容读取到list<t>中
        /// </summary>
        /// <param name="filestream">文件流</param>
        /// <param name="sheetname">指定读取excel工作薄sheet的名称</param>
        /// <returns>list<t></returns>
        private static list<t> inputexcel(stream filestream, string sheetname = null)
        {
            //创建excel数据结构
            iworkbook workbook = workbookfactory.create(filestream);
            //如果有指定工作表名称
            isheet sheet = null;
            if (!string.isnullorempty(sheetname))
            {
                sheet = workbook.getsheet(sheetname);
                //如果没有找到指定的sheetname对应的sheet,则尝试获取第一个sheet
                if (sheet == null)
                {
                    sheet = workbook.getsheetat(0);
                }
            }
            else
            {
                //如果没有指定的sheetname,则尝试获取第一个sheet
                sheet = workbook.getsheetat(0);
            }
            //实例化t数组
            list<t> list = new list<t>();
            if (sheet != null)
            {
                //一行最后一个cell的编号 即总的列数
                irow cellnum = sheet.getrow(0);
                int num = cellnum.lastcellnum;
                //获取泛型对象t的所有属性
                var propertys = typeof(t).getproperties();
                //每行转换为单个t对象
                for (int i = 1; i <= sheet.lastrownum; i++)
                {
                    irow row = sheet.getrow(i);
                    var obj = new t();
                    for (int j = 0; j < num; j++)
                    {
                        //没有数据的单元格都默认是null
                        icell cell = row.getcell(j);
                        if (cell != null)
                        {
                            var value = row.getcell(j).tostring();
                            string str = (propertys[j].propertytype).fullname;
                            if (str == "system.string")
                            {
                                propertys[j].setvalue(obj, value, null);
                            }
                            else if (str == "system.datetime")
                            {
                                datetime pdt = convert.todatetime(value, cultureinfo.invariantculture);
                                propertys[j].setvalue(obj, pdt, null);
                            }
                            else if (str == "system.boolean")
                            {
                                bool pb = convert.toboolean(value);
                                propertys[j].setvalue(obj, pb, null);
                            }
                            else if (str == "system.int16")
                            {
                                short pi16 = convert.toint16(value);
                                propertys[j].setvalue(obj, pi16, null);
                            }
                            else if (str == "system.int32")
                            {
                                int pi32 = convert.toint32(value);
                                propertys[j].setvalue(obj, pi32, null);
                            }
                            else if (str == "system.int64")
                            {
                                long pi64 = convert.toint64(value);
                                propertys[j].setvalue(obj, pi64, null);
                            }
                            else if (str == "system.byte")
                            {
                                byte pb = convert.tobyte(value);
                                propertys[j].setvalue(obj, pb, null);
                            }
                            else
                            {
                                propertys[j].setvalue(obj, null, null);
                            }
                        }
                    }
                    list.add(obj);
                }
            }
            return list;
        }

    }

如使用有问题,请留言。希望能帮到你~~~