亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

創建execl導入工具類的步驟

2020-01-24 02:43:30
字體:
來源:轉載
供稿:網友

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文件路徑,通過通用處理方法導出映射實體

復制代碼 代碼如下:

[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);
        }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美人成在线视频| 91在线观看欧美日韩| 日韩成人性视频| 欧美视频裸体精品| 中文字幕一区电影| 国产原创欧美精品| 日本精品久久久| 最近更新的2019中文字幕| 亚洲www视频| 国产一区二区精品丝袜| 精品久久香蕉国产线看观看gif| 亚洲激情免费观看| 国产91精品最新在线播放| 欧美一区二区三区四区在线| 国产精品视频免费在线| 69国产精品成人在线播放| 国产日韩综合一区二区性色av| 成人免费黄色网| 欧美一区二区三区精品电影| 亚洲欧美变态国产另类| 国产成人亚洲综合91精品| 国产精品视频午夜| 亚洲午夜av电影| 精品一区二区电影| 91中文字幕一区| 国产成人精品电影| 亚洲性视频网站| 成人av电影天堂| 日韩在线视频观看正片免费网站| 欧美美女18p| 色偷偷91综合久久噜噜| 韩剧1988在线观看免费完整版| 亚洲一区二区三区在线视频| 日韩a**中文字幕| 91精品久久久久久久久久久| 精品国产老师黑色丝袜高跟鞋| 欧美日韩在线观看视频小说| 九九精品在线视频| 欧美成人四级hd版| 亚洲肉体裸体xxxx137| 欧美黑人性生活视频| 俺也去精品视频在线观看| 久久久之久亚州精品露出| 国产精品黄页免费高清在线观看| 啪一啪鲁一鲁2019在线视频| 欧美成人四级hd版| 国产成人一区三区| 亚洲精品视频网上网址在线观看| 91精品国产色综合| 国产精品青草久久久久福利99| 日韩一区二区在线视频| 国产成人av网| 久久久精品视频在线观看| 国产精品欧美一区二区| 亚洲成人网久久久| 日韩精品中文字幕在线观看| 国产精品1234| 亚洲欧美日本伦理| 热久久这里只有精品| 日本精品va在线观看| 国产精品jizz在线观看麻豆| 亚洲一区二区三区乱码aⅴ| 亚洲欧美日韩一区二区在线| 国产一区二区三区免费视频| 国产一区二区三区在线播放免费观看| 欧美性猛交xxxx富婆| 91精品久久久久久久久| 在线观看欧美成人| 欧美精品成人在线| 亚洲男人天堂九九视频| 国产一区二区三区在线播放免费观看| 亚洲精品视频网上网址在线观看| 国产一区二区三区在线视频| 欧美超级免费视 在线| 一个人看的www欧美| 久久最新资源网| 欧美三级免费观看| 亚洲欧美综合另类中字| 国产一区二区久久精品| 国产精品白嫩美女在线观看| 亚洲综合成人婷婷小说| 国产美女久久久| 国产欧美一区二区白浆黑人| www.久久撸.com| 精品欧美aⅴ在线网站| 久久国产精品久久久| 午夜精品久久久久久久99热浪潮| 国产精品手机播放| 欧美亚洲另类在线| 亚洲天堂av图片| 久久69精品久久久久久国产越南| 欧美精品一区三区| 亚洲一区二区三区xxx视频| 精品偷拍各种wc美女嘘嘘| 国产日韩中文在线| 亚洲精品国产品国语在线| 亚洲精品白浆高清久久久久久| 97在线观看免费高清| 成人日韩av在线| 亚洲欧美三级伦理| 久久久久北条麻妃免费看| 91产国在线观看动作片喷水| 秋霞成人午夜鲁丝一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 精品国产美女在线| 国产精品大陆在线观看| 欧美俄罗斯性视频| 亚洲va久久久噜噜噜久久天堂| 国产a级全部精品| 欧美日韩国产二区| 亚洲综合在线小说| 亚洲男女性事视频| 久久激情视频久久| 欧美日韩综合视频| 91精品国产91久久久久福利| 亚洲免费av网址| 欧美精品久久久久a| 国产精品自产拍在线观看| 国产成人精品一区二区在线| 国产精品亚洲美女av网站| 日韩av一区在线| 日韩国产欧美精品一区二区三区| 夜夜嗨av色综合久久久综合网| 精品久久久久久亚洲精品| 国内精品模特av私拍在线观看| 91精品在线国产| 国产精品一区专区欧美日韩| 欧美精品久久久久久久| 7777精品久久久久久| 在线播放精品一区二区三区| 欧美成aaa人片免费看| 日本午夜在线亚洲.国产| 日韩美女免费视频| 羞羞色国产精品| 精品中文字幕在线2019| 亚洲视频综合网| 国产精品成人品| 欧美性做爰毛片| 欧美国产精品va在线观看| 麻豆国产精品va在线观看不卡| 日韩久久免费视频| 红桃av永久久久| 欧美激情欧美狂野欧美精品| 日韩在线免费视频| 国产免费久久av| 91网站在线看| 亚洲人成亚洲人成在线观看| 国产一区二区三区在线看| 欧美激情久久久| 国产+人+亚洲| 亚洲激情在线观看视频免费| 国产精品va在线播放| 正在播放国产一区| 国产精品久久久久久久久免费| 精品电影在线观看| 欧美激情中文字幕在线| 97视频网站入口| 91精品久久久久久久久中文字幕| 欧美一二三视频| 国色天香2019中文字幕在线观看| 日韩久久免费视频| 中文字幕在线看视频国产欧美| 91精品国产综合久久香蕉的用户体验| 欧美日韩福利视频|