当前位置:  编程技术>.net/c#/asp.net

创建execl导入工具类的步骤

    来源: 互联网  发布时间:2014-10-29

    本文导语:  1、创建实体属性标记 代码如下:public class CellAttribute : Attribute    {        ///         ///         ///         /// 显示名称        ///         public CellAttribute(string displayName, Type hander = null)        {      ...

1、创建实体属性标记

代码如下:

public class CellAttribute : Attribute
    {
        ///
        ///
        ///
        /// 显示名称
        ///
        public CellAttribute(string displayName, Type hander = null)
        {
            DisplayName = displayName;

            Hander = hander;
        }

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

        ///
        /// 类型
        ///
        public Type Hander { get; set; }
    }

2、创建通用处理方法

代码如下:

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

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

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

        ///
        /// 获取整个xls文件对应行的T对象
        ///
        ///
        public List ToData()
        {
            List dataList = new List();
            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;
        }

        ///
        /// 获取T对象
        ///
        ///
        ///
        ///
        ///
        ///
        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;
        }

        ///
        /// 动态执行处理方法
        ///
        ///
        ///
        ///
        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 });
        }

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

        ///
        /// 获取xls文件单元格的值
        ///
        ///
        ///
        ///
        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;
        }

        ///
        /// 设置T属性值
        ///
        ///
        ///
        ///
        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文件路径,通过通用处理方法导出映射实体

代码如下:

[Test]
        public void Read1()
        {
            const string filePath = @"C:UserszkDesktop1.xls";
            XlsFileHandler handler = new XlsFileHandler(filePath);
            List readMappers = handler.ToData();
            Assert.AreEqual(readMappers.Count, 3);
        }

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HTML5 sprite 样式创建工具Stitches介绍
  • VMware虚拟机创建工具 Live View
  • 报表创建工具 FreeReportBuilder
  • RSA/DSA公钥创建工具 XCA
  • SSH隧道创建工具 SSHTunnel
  • AJAX UI 创建工具 Sigma Ajax UI builder
  • CSS Sprite 创建工具 Stitches
  • 条形码图像创建工具 JBarcode
  • Fedora9中虚拟机工具不能创建虚拟机
  • 用autotools工具创建makefile文件问题
  • 什么工具能创建启动盘
  • c#创建浮动工具栏功能示例
  • XML 创建和编辑工具 xmodifier
  • C++ Bitsets 成员 Constructors:创建新bitsets
  • 菜鸟在c盘装了win2000,想在剩下的空间装Red Hat Enterprise Linux 3,在创建linux分区的时候,不知道都创建什么分区??我知道要创建一个
  • C++ Double Ended Queues(双向队列) 成员 Constructors:创建一个新双向队列
  • 一进程源源不断地创建文件,另一进程把这些创建的文件抓取并挪走
  • C++ I/O 成员 open():创建一个输入流
  • 创建用户组创建用户出错
  • java Servlet实现Session创建存取以及url重写代码示例
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • linux如何创建一个共享内存 可以mount 可以创建目录之类 跟硬盘分区一样
  • php循环创建目录示例分享(php创建多级目录)
  • navicat 8 创建数据库与创建用户分配权限图文方法
  • sql server 2008:您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
  • mkdir()是创建文件夹的函数,有没有循环创建多个目录级的函数呢?
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • FTP上创建的文件夹的创建日期始终和本机的对不上(无论如何改变日期和时间)(紧急!!!)
  • 急!linux下mysql的创建用户组和创建用户命令不能生效啊????
  • 怎么创建包,我创建包后,怎么找不到呢?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3