.net NPOI List集合导入导出封装(反射)

1 篇文章 0 订阅

.net NPOI List集合导入导出封装(反射)

一、 导出一个只有一个sheet的excel表格

  /// <summary>
        /// 导出一个只有一个sheet的excel表格
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list">数据源集合</param>
        /// <param name="filePath">选择的文件夹的路径(包括拓展名)(不给默认第一行)</param>
        /// <param name="startRow">表格中数据开始行(根据表格里的坐标)(不给默认第一列)</param>
        /// <param name="startColumn">表格中数据开始列(根据表格里的坐标)</param>
        static public void ExportOneSheepExcel<T>(List<T> list, string filePath, int startRow = 1, int startColumn = 1)
        {
            int a = startRow - 1;  //接收传来的开始行,得到开始行下标
            int b = startColumn - 1;//接收传来的开始列,得到开始列下标
            //创建工作本
            HSSFWorkbook book = new HSSFWorkbook();
            //创建sheet
            ISheet sheet = book.CreateSheet("Sheet1");
            //获取类的映射
            Type t = typeof(T);
            //获取类属性
            PropertyInfo[] ps = t.GetProperties();
            #region 如果要创建列头
            /*
            创建列头(行)
            IRow headRow = sheet.CreateRow(a);
            for (int i = 0; i < ps.Length; i++)
            {
                row.CreateCell(b).SetCellValue(ps[i].Name);
                b++;
            }
            a++;
            */
            #endregion   
            //创建身体
            for (int j = 0; j < list.Count; j++)
            {
                IRow row = sheet.CreateRow(a);//创建身体的行
                //列下标回归
                b = startColumn - 1;
                //列
                for (int k = 0; k < ps.Length; k++)
                {
                    row.CreateCell(b).SetCellValue(ps[k].GetValue(list[j])!=null? ps[k].GetValue(list[j]).ToString():null);
                    b++;
                }
                a++;//开始下一行
            }
            //判断有没有这个文件
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            //写入文件//没有就创建,有就打开
            using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                book.Write(fs);
            }
        }

二、 要按照设定sheet的尺寸,分成多个sheet,最终得到一个excel表格

/// <summary>
        /// 要按照设定sheet的尺寸,分成多个sheet,最终得到一个excel表格
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list">总数据集合</param>
        /// <param name="filePath">表格存放文件夹的路径(包括拓展名)</param>
        /// <param name="sheetSize">每一个sheet的尺寸</param>
        /// <param name="startRow">表格中数据开始行(根据表格里的坐标)(不给默认第一行)</param>
        /// <param name="startColumn">表格中数据开始列(根据表格里的坐标)(不给默认第一列)</param>
        static public void ExportManySheepExcel<T>(List<T> list, string filePath, int sheetSize, int startRow = 1, int startColumn = 1)
        {
            int a = startRow - 1;  //接收传来的开始行,得到开始行下标
            int b = startColumn - 1;//接收传来的开始列,得到开始列下标
            //获取类的映射 
            Type t = typeof(T);
            //获取类属性
            PropertyInfo[] ps = t.GetProperties();
            //创建工作本
            HSSFWorkbook book = new HSSFWorkbook();
            int sheetCount = Convert.ToInt32(Math.Ceiling(list.Count * 1.0 / sheetSize));
            for (int i = 1; i <= sheetCount; i++)//循环次数为sheet个数
            {
                //此时的集合为
                List<T> newList = list.Skip((i - 1) * sheetSize).Take(sheetSize).ToList();
                //创建sheet
                ISheet sheet = book.CreateSheet($"Sheet{i}");
                #region 如果要创建列头
                /*
                //创建列头(行)
                IRow headRow = sheet.CreateRow(a);
                for (int j = 0; j < ps.Length; j++)
                {
                    headRow.CreateCell(b).SetCellValue(ps[j].Name);
                    b++;
                }
                a++;
                */
                #endregion
                //创建身体
                for (int k = 0; k < newList.Count; k++)
                {
                    IRow row = sheet.CreateRow(a);//创建身体的行   
                    b = startColumn - 1;//列下标回归
                    //列
                    for (int n = 0; n < ps.Length; n++)
                    {
                        row.CreateCell(b).SetCellValue(ps[n].GetValue(newList[k])!=null? ps[n].GetValue(newList[k]).ToString():null);
                        b++;
                    }
                    a++;
                }
                a = startRow - 1;//行下标回归
                b = startColumn - 1;//列下标回归
            }
            //判断有没有这个文件
            if (File.Exists(filePath))
            {
                File.Delete(filePath);
            }
            using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                book.Write(fs);
            }
        }

三、从Excel表格导入数据成为list集合类型
这个后面数据类型可以自己设置

/// <summary>
        /// 从Excel表格导入数据成为list集合类型 (字段必须对应)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath">表格的路径(包括名字和后缀名)</param>
        /// <param name="startRow">表格开始行数(参照表格)(不给默认第一行)</param>
        /// <param name="startColumn">表格开始列(不给默认第一列)</param>
        /// <param name="endRow">表格最后一行数(不给默认表格最后有数据的一行)</param>
        /// <returns></returns>
        static public List<T> GetListFromExcel<T>(string filePath, int startRow=1, int startColumn = 1, int endRow = -1)
        {
            //获取类的映射
            Type t = typeof(T);
            //获取类属性
            PropertyInfo[] ps = t.GetProperties();
            List<T> list = new List<T>();
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                //读取工作本
                HSSFWorkbook book = new HSSFWorkbook(fs);
                //获取sheet
                ISheet sheet = book.GetSheet("Sheet1");//默认就是Sheet1
                //获得最后一行的下标
                int temp;
                if (endRow==-1)//如果没给最后一行的行数
                {
                    temp = sheet.LastRowNum;
                }
                else
                {
                    temp = endRow - 1;
                }
                //读内容
                IRow row = null;
                for (int i = startRow - 1; i <= temp; i++)//决定了循环多少次
                {
                    //获得行
                    row = sheet.GetRow(i);
                    //实例化
                    T m = (T)Activator.CreateInstance(t);
                    //列的下标回归
                    int b = startColumn - 1;
                    //循环赋值
                    for (int j = 0; j < ps.Length; j++)
                    {
                        //判断这一列单元格存不存在(是否为空)
                        ICell cell = row.GetCell(b);
                        if (cell == null)//为空跳过
                        {
                            b++;
                            continue;
                        }
                        //获得这一列字段类型
                        string pType = ps[j].PropertyType.ToString();
                        switch (pType)
                        {
                            case "System.Int32"://Int32
                                ps[j].SetValue(m, Convert.ToInt32(cell.NumericCellValue));
                                break;
                            case "System.String"://String
                                ps[j].SetValue(m, cell.StringCellValue);
                                break;
                            case "System.Double"://Double
                                ps[j].SetValue(m, cell.NumericCellValue);
                                break;
                            case "System.Decimal"://Decimal
                                ps[j].SetValue(m,Convert.ToDecimal(cell.NumericCellValue));
                                break;
                            case "System.Boolean"://Bool
                                ps[j].SetValue(m, cell.StringCellValue.ToString().Equals("是") ? true : false);
                                break;
                            case "System.DateTime"://DateTime
                                ps[j].SetValue(m, cell.DateCellValue);
                                break;
                            default:
                                break;
                        }
                        b++;
                    }
                    list.Add(m);
                }
            }
            return list;
        }

四、返回DataTable

static public DataTable GetListFromExcel(string filePath,string tableName= "Sheet1")
        {
            DataTable dt = new DataTable();
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                XSSFWorkbook book = new XSSFWorkbook(fs);
                ISheet sheet = book.GetSheet(tableName);
                IRow headerRow = sheet.GetRow(0);
                int endColumn = headerRow.LastCellNum;
                for (int j = 0; j < endColumn; j++)
                {
                    dt.Columns.Add();
                }
                IRow row = null;
                for (int i = 0; i <= sheet.LastRowNum; i++)
                {
                    row = sheet.GetRow(i);
                    dt.Rows.Add();
                    for (int j = 0; j < endColumn; j++)
                    {
                        ICell cell = row.GetCell(j);
                        if (cell == null)
                        {
                            continue;
                        }
                        if (cell.CellType==CellType.Numeric)
                        {
                            if (DateUtil.IsCellDateFormatted(cell))
                            {
                                dt.Rows[i][j] = cell.DateCellValue.ToString("yyyy/MM/dd");
                            }
                            else
                            {
                                dt.Rows[i][j] = cell.ToString();
                            }
                        }
                        else
                        {
                            dt.Rows[i][j] = cell.ToString();
                        }
                    }
                }
            }
            return dt;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值