通用的读写Excel_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 通用的读写Excel

通用的读写Excel

 2013/12/4 15:26:00  澈澈  博客园  我要评论(0)
  • 摘要:因为支持csv,所以就一块写上了Workbook,WorksheetusingAspose.Cells(第三方)----把Excel读取到属性对象列表,需要传入对象类型和文件路径.例:List<PropSetCurrency>currencyList=this.GetObjectList<PropSetCurrency>(filePath);注:Excel的表头需要和对象名对应(可无序),且第一列不能为空----把属性对象列表保存到Excel
  • 标签:excel

因为支持csv,所以就一块写上了
Workbook,Worksheet using Aspose.Cells(第三方)


----
把Excel读取到属性对象列表,需要传入对象类型和文件路径.
例:
List<PropSetCurrency> currencyList = this.GetObjectList<PropSetCurrency>(filePath);
注:Excel的表头需要和对象名对应(可无序),且第一列不能为空


----
把属性对象列表保存到Excel,需要传入对象列表和保存的文件完整路径.
例:
this.SetExcelList(currencyList,"c://currencyList.excel");
----

/// <summary>
        /// 从Excel获取数据
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="filePath">文件完整路径</param>
        /// <returns>对象列表</returns>
        public List<T> GetObjectList<T>(string filePath) where T : new()
        {
            List<T> list = new List<T>();
            if (!filePath.Trim().EndsWith("csv") && !filePath.Trim().EndsWith("xlsx"))
            {
                return list;
            }

            Type type = typeof(T);
            Workbook workbook = new Workbook(filePath);
            Worksheet sheet = workbook.Worksheets[0];

            // 获取标题列表
            var titleDic = this.GetTitleDic(sheet);

            // 循环每行数据
            for (int i = 1; i < int.MaxValue; i++)
            {
                // 行为空时结束
                if (string.IsNullOrEmpty(sheet.Cells[i, 0].StringValue))
                {
                    break;
                }

                T instance = new T();

                // 循环赋值每个属性
                foreach (var item in type.GetProperties())
                {
                    if (titleDic.ContainsKey(item.Name))
                    {
                        string str = sheet.Cells[i, titleDic[item.Name]].StringValue;
                        if (!string.IsNullOrEmpty(str))
                        {
                            try
                            {
                                // 根据类型进行转换赋值
                                if (item.PropertyType == typeof(string))
                                {
                                    item.SetValue(instance, str);
                                }
                                else if (item.PropertyType.IsEnum)
                                {
                                    item.SetValue(instance, int.Parse(str));
                                }
                                else
                                {
                                    MethodInfo method = item.PropertyType.GetMethod("Parse", new Type[] { typeof(string) });
                                    object obj = null;
                                    if (method != null)
                                    {
                                        obj = method.Invoke(null, new object[] { str });
                                        item.SetValue(instance, obj);
                                    }
                                }
                            }
                            catch (Exception)
                            {
                                // 获取错误
                            }
                        }
                    }
                }

                list.Add(instance);
            }

            return list;
        }

        /// <summary>
        /// 把对象List保存到Excel
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="objList">对象列表</param>
        /// <param name="saveFilePath">保存文件的完整路径,包括文件类型</param>
        public void SetExcelList<T>(List<T> objList, string saveFilePath)
        {
            if (!saveFilePath.Trim().EndsWith("csv") && !saveFilePath.Trim().EndsWith("xlsx"))
            {
                return;
            }

            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.Worksheets[0];

            // 冻结第一行
            sheet.FreezePanes(1, 1, 1, 0);

            // 循环插入每行
            int row = 0;
            foreach (var obj in objList)
            {
                int column = 0;
                var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly);
                if (row == 0)
                {
                    foreach (var titName in properties)
                    {
                        sheet.Cells[0, column].PutValue(titName.Name);
                        column++;
                    }

                    row++;
                }

                // 循环插入当前行的每列
                column = 0;
                foreach (var property in properties)
                {
                    var itemValue = property.GetValue(obj);
                    sheet.Cells[row, column].PutValue(itemValue.ToString());
                    column++;
                }

                row++;
            }

            workbook.Save(saveFilePath);
        }

        /// <summary>
        /// 获取标题行数据
        /// </summary>
        /// <param name="sheet">sheet</param>
        /// <returns>标题行数据</returns>
        private Dictionary<string, int> GetTitleDic(Worksheet sheet)
        {
            Dictionary<string, int> titList = new Dictionary<string, int>();
            for (int i = 0; i < int.MaxValue; i++)
            {
                if (sheet.Cells[0, i].StringValue == string.Empty)
                {
                    return titList;
                }

                titList.Add(sheet.Cells[0, i].StringValue, i);
            }

            return titList;
        }

 


写的比较仓促,有问题之处忘指出.

发表评论
用户名: 匿名