zoukankan      html  css  js  c++  java
  • .Net Core 使用 NPOI 导入Excel

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

    /// <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;
            }
    
        }
    View Code

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

  • 相关阅读:
    Tomcat/ WebSphere/WebLogic的作用和特点
    Servlet 执行时一般实现哪几个方法?
    synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
    Request 对象的主要方法
    char 型变量中能不能存贮一个中文汉字?为什么?
    描述一下 JVM 加载 class 文 件的原理机制?
    单例设计模式
    Thread和Runnable
    Math.round方法、String实例化
    思路清晰的秘诀:结构化思维(自上而下)
  • 原文地址:https://www.cnblogs.com/wuzhixiong/p/11991327.html
Copyright © 2011-2022 走看看