NPOI导入导出Excel

  最近较忙,上一篇文章的其他交换机没时间写,我又遇到一个新需求NPOI导入导出Excel,不多废话了,上源码:

简介:

  NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目, 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

NPOI的优势:

1、完全免费的框架
2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
3、专业的技术支持服务(24*7全天候) (非免费)
4、支持处理的文件格式包括xls, xlsx, docx.
5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
6、同时支持文件的导入和导出
7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
8、你不需要在服务器上安装微软的Office,可以避免版权问题。
9、使用起来比Office PIA的API更加方便,更人性化。
10、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
 

EXCEL导入

        /// <summary>
        /// 导入
        /// </summary>
        /// <returns></returns>
        public JsonResult ExcelImport()
        {
            //var files = Request.Files[0];
            HttpPostedFileBase fileBase = Request.Files[0];
            if (fileBase == null || fileBase.ContentLength <= 0)
            {
                return Json("只能上传Excel文件!");
            }
            try
            {
                //获取文件后缀名
                string FinName = Path.GetExtension(fileBase.FileName);
                //获取文件内容
                Stream streamFile = fileBase.InputStream;
                DataTable dt = new DataTable();
                if (FinName != ".xls" && FinName != ".xlsx")
                {
                    return Json("只能上传Excel文件!");
                }
                else
                {
                    if (FinName == ".xls")
                    {
                        //创建一个webbook,对应一个Excel文件(用于xls文件导入类)
                        HSSFWorkbook book = new HSSFWorkbook(streamFile);
                        dt = HSSFExcel(dt, book);
                    }
                    else
                    {
                        XSSFWorkbook book = new XSSFWorkbook(streamFile);
                        dt = XSSFExcel(dt, book);
                    }
                    if (dt == null)
                    {
                        return Json("导入失败!");
                    }
                    else
                    {
                        return Json("成功");
                    }
                }
            }
            catch (Exception ex)
            {
                return Json("导入失败! " + ex.Message);
            }
        }
        /// <summary>
        /// .xls文件导入
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="book"></param>
        /// <returns></returns>
        public DataTable HSSFExcel(DataTable dt, HSSFWorkbook book)
        {
            // 在webbook中添加一个sheet,对应Excel文件中的sheet,读取当前表数据,索引是0 
            ISheet sheet = book.GetSheetAt(0);
            //读取行数据
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
            for (int i = 0; i < (sheet.GetRow(0).LastCellNum); i++)
            {
                dt.Columns.Add(sheet.GetRow(0).Cells[i].ToString());
            }
            while (rows.MoveNext())
            {
                HSSFRow row = (HSSFRow)rows.Current;
                DataRow dr = dt.NewRow();
                for (int i = 0; i < row.LastCellNum; i++)
                {
                    ICell cell = row.GetCell(i);
                    if (cell == null)
                    {
                        dr[i] = null;
                    }
                    else
                    {
                        dr[i] = cell.ToString();
                    }
                    if (cell != null)
                    {
                        if (cell.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(cell))
                        {
                            dr[i] = cell.DateCellValue.ToString("yyyyMMdd HH:ss");
                        }
                        else
                        {
                            dr[i] = row.GetCell(i).ToString();
                        }
                    }
                }
                dt.Rows.Add(dr);
            }
            dt.Rows.RemoveAt(0);
            return dt;
        }
        /// <summary>
        /// .xlsx文件导入
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="book"></param>
        /// <returns></returns>
        public DataTable XSSFExcel(DataTable dt, XSSFWorkbook book)
        {
            ISheet sheet = book.GetSheetAt(0);
            System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
            for (int i = 0; i < (sheet.GetRow(0).LastCellNum); i++)
            {
                dt.Columns.Add(sheet.GetRow(0).Cells[i].ToString());
            }
            while (rows.MoveNext())
            {
                XSSFRow row = (XSSFRow)rows.Current;
                DataRow dr = dt.NewRow();
                for (int i = 0; i < row.LastCellNum; i++)
                {
                    ICell cell = row.GetCell(i);
                    if (cell == null)
                    {
                        dr[i] = null;
                    }
                    else
                    {
                        dr[i] = cell.ToString();
                    }
                    if (cell != null)
                    {
                        if (cell.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(cell))
                            dr[i] = cell.DateCellValue.ToString("yyyy/MM/dd HH:ss:mm");
                        else
                        {
                            dr[i] = row.GetCell(i).ToString();
                        }
                    }
                }
                dt.Rows.Add(dr);
            }
            dt.Rows.RemoveAt(0);
            return dt;
        }

Excel导出:

 
 
 public JsonResult ExcelExport()
        {
            List<User> list = new List<User>() {
                   new User (){  Id=1, Age=20, Name="yanboling", Sex=""},
                   new User() { Id = 1, Age = 22, Name = "PANLIW", Sex = "" },
                   new User() { Id = 1, Age = 21, Name = "CEHNGSHIQI", Sex = "" },
                   new User() { Id = 1, Age = 23, Name = "WANGTAO", Sex = "" }
                };

            var dt = ToDataTable<User>(list);
            TableToExcel(dt, @"G:\狗粮管够.xls");
            return Json("成功");
        }
  public static void TableToExcel(DataTable dt, string file)
        {
            IWorkbook workbook;
            //创建workbook
            string fileExt = Path.GetExtension(file).ToLower();
            if (fileExt == ".xlsx")
            {
                workbook = new XSSFWorkbook();
            }
            else if (fileExt == ".xls")
            {
                workbook = new HSSFWorkbook();
            }
            else
            {
                workbook = null;
            }
            if (workbook == null)
            {
                return;
            }
            ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);

            //表头  
            IRow row = sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell cell = row.CreateCell(i);
                cell.SetCellValue(dt.Columns[i].ColumnName);
            }

            //数据  
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = row1.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }
            //转为字节数组  
            MemoryStream stream = new MemoryStream();
            workbook.Write(stream);
            var buf = stream.ToArray();

            //保存为Excel文件  
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }
        }

list转DataTable:

   public static DataTable ToDataTable<T>(List<T> items)
        {
            var tb = new DataTable(typeof(T).Name);

            PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo prop in props)
            {
                Type t = prop.PropertyType;//GetCoreType(prop.PropertyType);
                tb.Columns.Add(prop.Name, t);
            }

            foreach (T item in items)
            {
                var values = new object[props.Length];

                for (int i = 0; i < props.Length; i++)
                {
                    values[i] = props[i].GetValue(item, null);
                }

                tb.Rows.Add(values);
            }

            return tb;
        }
        public static Type GetCoreType(Type t)
        {
            if (t != null && !"".Equals(t))
            {
                if (!t.IsValueType)
                {
                    return t;
                }
                else
                {
                    return Nullable.GetUnderlyingType(t);
                }
            }
            else
            {
                return t;
            }
        }


      public class User
      {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
      }

 

源码:

百度网盘:

链接:https://pan.baidu.com/s/1m6Hv50AqhEJRudP6u7Jx1w
提取码:2180

 
posted @ 2020-07-31 11:47  天神下凡一锤四  阅读(234)  评论(0编辑  收藏  举报