欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

創(chuàng)建execl導入工具類的步驟

 更新時間:2014年04月07日 16:10:27   作者:  
這篇文章主要介紹了創(chuàng)建execl導入工具類的步驟,需要的朋友可以參考下

1、創(chuàng)建實體屬性標記

復制代碼 代碼如下:

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、創(chuàng)建通用處理方法

復制代碼 代碼如下:

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>
        /// 創(chuàng)建映射
        /// </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>
        /// 動態(tài)執(zhí)行處理方法
        /// </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、創(chuàng)建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);
        }

相關(guān)文章

  • c#中的泛型委托詳解

    c#中的泛型委托詳解

    本文主要介紹了c#中的泛型委托。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C# 圖片與Base64碼的相互轉(zhuǎn)化問題(代碼詳解)

    C# 圖片與Base64碼的相互轉(zhuǎn)化問題(代碼詳解)

    這篇文章主要介紹了C# 圖片與Base64碼的相互轉(zhuǎn)化的代碼,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • c#接口使用示例分享

    c#接口使用示例分享

    接口與抽象類一樣,也是表示某種規(guī)則,一旦使用了該規(guī)則,就必須實現(xiàn)相關(guān)的方法。對于C#語言而言,由于只能繼承自一個父類,因此若有多個規(guī)則需要實現(xiàn),則使用接口是個比較好的做法
    2014-02-02
  • C#實現(xiàn)簡單訂單管理程序

    C#實現(xiàn)簡單訂單管理程序

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單訂單管理程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C#添加Windows服務 定時任務

    C#添加Windows服務 定時任務

    這篇文章主要為大家詳細介紹了C#添加Windows服務,定時任務的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • C#線程執(zhí)行超時處理與并發(fā)線程數(shù)控制實例

    C#線程執(zhí)行超時處理與并發(fā)線程數(shù)控制實例

    這篇文章主要介紹了C#線程執(zhí)行超時處理與并發(fā)線程數(shù)控制的方法,實例講述了并發(fā)執(zhí)行存儲過程的最大個數(shù),讀者可對程序稍做改動即控制并發(fā)線程數(shù),具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • C#連接mysql的方法【基于vs2010】

    C#連接mysql的方法【基于vs2010】

    這篇文章主要介紹了C#連接mysql的方法,基于vs2010平臺較為詳細的講述了C#操作mysql所需的組件下載、安裝及連接mysql操作實現(xiàn)代碼,需要的朋友可以參考下
    2017-03-03
  • C#使用log4net記錄日志

    C#使用log4net記錄日志

    本文詳細講解了C#使用log4net記錄日志的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • 使用C#實現(xiàn)網(wǎng)頁內(nèi)容保存為圖片并生成壓縮包

    使用C#實現(xiàn)網(wǎng)頁內(nèi)容保存為圖片并生成壓縮包

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)網(wǎng)頁內(nèi)容保存為圖片并生成壓縮包,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • C#實現(xiàn)將日期格式化為指定格式

    C#實現(xiàn)將日期格式化為指定格式

    這篇文章主要為大家詳細介紹了C#如何使用DateTime.Now.ToString方法將日期格式化為指定格式,文中的示例代碼講解詳細,有需要的小伙伴可以參考下
    2024-01-01

最新評論