创建execl导入工具类的步骤

时间:2022-03-11 11:41:09 

1、创建实体属性标记


public class CellAttribute : Attribute
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="displayName">显示名称</param>
        /// <param name="hander"></param>
        public CellAttribute(string displayName, Type hander = null)
        {
            DisplayName = displayName;

            Hander = hander;
        }

        /// <summary>
        /// 显示名称
        /// </summary>
        public string DisplayName { get; set; }

        /// <summary>
        /// 类型
        /// </summary>
        public Type Hander { get; set; }
    }

2、创建通用处理方法


public class XlsFileHandler<T> where T : new()
    {
        private readonly string _path;
        private readonly Dictionary<string, CellAttribute> _cellAttributes;
        readonly Dictionary<string, string> _propDictionary;

        public XlsFileHandler(string path)
        {
            _path = path;
            _cellAttributes = new Dictionary<string, CellAttribute>();
            _propDictionary = new Dictionary<string, string>();
            CreateMappers();
        }

        /// <summary>
        /// 创建映射
        /// </summary>
        private void CreateMappers()
        {
            foreach (var prop in typeof(T).GetProperties())
            {
                foreach (CellAttribute cellMapper in prop.GetCustomAttributes(false).OfType<CellAttribute>())
                {
                    _propDictionary.Add(cellMapper.DisplayName, prop.Name);
                    _cellAttributes.Add(cellMapper.DisplayName, cellMapper);
                }
            }
        }

        /// <summary>
        /// 获取整个xls文件对应行的T对象
        /// </summary>
        /// <returns></returns>
        public List<T> ToData()
        {
            List<T> dataList = new List<T>();
            using (FileStream stream = GetStream())
            {
                IWorkbook workbook = new HSSFWorkbook(stream);
                ISheet sheet = workbook.GetSheetAt(0);
                var rows = sheet.GetRowEnumerator();
                int lastCell = 0;
                int i = 0;
                IRow headRow = null;
                while (rows.MoveNext())
                {
                    var row = sheet.GetRow(i);
                    if (i == 0)
                    {
                        headRow = sheet.GetRow(0);
                        lastCell = row.LastCellNum;
                    }
                    else
                    {
                        T t = GetData(workbook, headRow, row, lastCell);
                        dataList.Add(t);
                    }
                    i++;
                }
                stream.Close();
            }
            return dataList;
        }

        /// <summary>
        /// 获取T对象
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="headRow"></param>
        /// <param name="currentRow"></param>
        /// <param name="lastCell"></param>
        /// <returns></returns>
        private T GetData(IWorkbook workbook, IRow headRow, IRow currentRow, int lastCell)
        {
            T t = new T();
            for (int j = 0; j < lastCell; j++)
            {
                var displayName = headRow.Cells[j].StringCellValue;
                if (!_cellAttributes.ContainsKey(displayName) || !_propDictionary.ContainsKey(displayName))
                {
                    continue;
                }
                var currentAttr = _cellAttributes[displayName];
                var propName = _propDictionary[displayName];

                ICell currentCell = currentRow.GetCell(j);
                string value = currentCell != null ? GetCellValue(workbook, currentCell) : "";
                if (currentAttr.Hander != null)
                {
                    SetValue(ref t, propName, InvokeHandler(currentAttr.Hander, value));
                }
                else
                {
                    SetValue(ref t, propName, value);
                }
            }
            return t;
        }

        /// <summary>
        /// 动态执行处理方法
        /// </summary>
        /// <param name="type"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private static object InvokeHandler(Type type, object value)
        {
            System.Reflection.ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes);
            if (constructor == null) throw new ArgumentNullException("type");
            object mgConstructor = constructor.Invoke(null);
            System.Reflection.MethodInfo method = type.GetMethod("GetResults");
            return method.Invoke(mgConstructor, new[] { value });
        }

        /// <summary>
        /// 获取文件流
        /// </summary>
        /// <returns></returns>
        private FileStream GetStream()
        {
            if (!File.Exists(_path)) throw new FileNotFoundException("path");
            return new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.Read);
        }

        /// <summary>
        /// 获取xls文件单元格的值
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="cell"></param>
        /// <returns></returns>
        private static string GetCellValue(IWorkbook workbook, ICell cell)
        {
            string value;
            switch (cell.CellType)
            {
                case CellType.FORMULA:
                    HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
                    value = evaluator.Evaluate(cell).FormatAsString();
                    break;
                default:
                    value = cell.ToString();
                    break;
            }
            return value;
        }

        /// <summary>
        /// 设置T属性值
        /// </summary>
        /// <param name="t"></param>
        /// <param name="propName"></param>
        /// <param name="value"></param>
        private static void SetValue(ref T t, string propName, object value)
        {
            var typeName = t.GetType().GetProperty(propName).PropertyType.Name;
            var property = t.GetType().GetProperty(propName);
            switch (typeName)
            {
                case "Int32":
                    property.SetValue(t, Convert.ToInt32(value), null);
                    break;
                case "DateTime":
                    property.SetValue(t, Convert.ToDateTime(value), null);
                    break;
                case "Decimal":
                    property.SetValue(t, Convert.ToDecimal(value), null);
                    break;
                default:
                    property.SetValue(t, value, null);
                    break;
            }
        }
    }

3、创建Execl文件映射类


public class ReadMapper
    {
        [CellAttribute("测试1")]
        public decimal Code { get; set; }

        [CellAttribute("测试2")]
        public int Name { get; set; }

        [CellAttribute("测试3", typeof(ClassCellHander))]
        public string Group { get; set; }

        [CellAttribute("测试4")]
        public DateTime AddTime { get; set; }
    }

4、指定Execl文件路径,通过通用处理方法导出映射实体
创建execl导入工具类的步骤


[Test]
        public void Read1()
        {
            const string filePath = @"C:\Users\zk\Desktop\1.xls";
            XlsFileHandler<ReadMapper> handler = new XlsFileHandler<ReadMapper>(filePath);
            List<ReadMapper> readMappers = handler.ToData();
            Assert.AreEqual(readMappers.Count, 3);
        }

标签:execl,导入
0
投稿

猜你喜欢

  • Java的反射机制---动态调用对象的简单方法

    2023-08-16 19:23:26
  • Java8 Stream流的常用方法汇总

    2023-07-17 17:56:59
  • 详解C#中的session用法

    2022-10-29 22:03:13
  • 一文探寻Java装箱和拆箱的奥妙

    2022-08-15 21:41:21
  • mybatis的if判断integer问题

    2022-12-23 20:15:41
  • centos 安装java环境的多种方法

    2023-08-10 16:01:37
  • java 输入一个数字组成的数组(输出该数组的最大值和最小值)

    2023-11-24 21:41:58
  • 浅谈C#中对引用类型的误解

    2021-10-18 12:40:37
  • Java基础教程之接口的继承与抽象类

    2023-11-06 20:47:22
  • fastjson全局日期序列化设置导致JSONField失效问题解决方案

    2021-12-13 10:58:24
  • Intellij搭建springmvc常见问题解决方案

    2023-07-23 12:53:29
  • C#实现单词本功能

    2021-11-06 13:08:23
  • Java集合框架Collections原理及用法实例

    2021-12-04 18:10:20
  • C# 反射与 Quartz 实现流程处理详情

    2022-11-11 09:11:07
  • Springboot整合MybatisPlus的实现过程解析

    2021-06-14 02:47:06
  • SpringBoot 整合 Shiro 密码登录的实现代码

    2023-11-10 11:27:59
  • 关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

    2021-07-19 17:06:34
  • 基于Android中获取资源的id和url方法总结

    2023-06-20 06:05:21
  • Java 3种方法实现进制转换

    2022-03-24 00:02:03
  • Java实现高校教务系统

    2022-05-16 04:24:17
  • asp之家 软件编程 m.aspxhome.com