Mvc导入导出Excel

在项目中添加对NPOI的引用

视图部分如下:

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

@Html.ActionLink("导出用户", "ExportExcel")
<br />
@using (@Html.BeginForm("ImportExcel", "Excel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <text>选择上传Excel文件:</text>
    <input name="file" type="file" id="file" />
    <input type="submit" name="Upload" value="批量导入用户" />

  控制器部分:

public class ExcelController : Controller
    {
        //
        // GET: /Excel/

        public ActionResult Index()
        {
            return View();
        }
        /// <summary>
        /// 批量导出Excel
        /// </summary>
        /// <returns></returns>
        public FileResult ExportExcel()
        {
            //创建Excel文件的对象
            NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
            //添加一个sheet
            NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
            //获取list数据
            WinDataEntities db = new WinDataEntities();//EF上下文对象
            List<UserInfo> list = db.UserInfo.Where<UserInfo>(u => true).ToList();
            //给sheet1添加第一行的头部标题
            NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
            row1.CreateCell(0).SetCellValue("姓名");
            row1.CreateCell(1).SetCellValue("登录名");
            //将数据逐步写入sheet1各个行
            for (int i = 0; i < list.Count; i++)
            {
                NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
                rowtemp.CreateCell(0).SetCellValue(list[i].TrueName);
                rowtemp.CreateCell(1).SetCellValue(list[i].UserName);
            }
            // 写入到客户端 
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            book.Write(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return File(ms, "application/vnd.ms-excel", "用户.xls");
        }
        /// <summary>
        /// 批量导入Excel
        /// </summary>
        /// <returns></returns>
        public ActionResult ImportExcel()
        {
            try
            {

            HttpPostedFileBase file = Request.Files["file"];//接收客户端传递过来的数据.
                if(file==null)
                {
                    return Content("请选择上传的Excel文件");
                }
                else
                {
                    //对文件的格式判断,此处省略
                    WinDataEntities db = new WinDataEntities();//EF上下文对象
                    Stream inputStream = file.InputStream;
                    HSSFWorkbook hssfworkbook = new HSSFWorkbook(inputStream);
                    NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0);
                    // IRow headerRow = sheet.GetRow(0);//第一行为标题行
                    // int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells
                    int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1

                    for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
                    {
                        IRow row = sheet.GetRow(i);
                        NewUser model = new NewUser();

                        if (row != null)
                        {
                            if (row.GetCell(0) != null)
                            {
                                model.TrueName = GetCellValue(row.GetCell(0));
                            }
                            if (row.GetCell(1) != null)
                            {
                                model.LoginName = GetCellValue(row.GetCell(1));
                            }

                        }

                        db.NewUser.Add(model);
                    }
                    db.SaveChanges();
                    return Content("导入成功");
                }

            }
            catch (Exception)
            {

                return Content("导入失败");
            }
            

        }
        /// <summary>
        /// 根据Excel列类型获取列的值
        /// </summary>
        /// <param name="cell">Excel列</param>
        /// <returns></returns>
        private static string GetCellValue(ICell cell)
        {
            if (cell == null)
                return string.Empty;
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return string.Empty;
                case CellType.Boolean:
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Numeric:
                case CellType.Unknown:
                default:
                    return cell.ToString();//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Formula:
                    try
                    {
                        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
                        e.EvaluateInCell(cell);
                        return cell.ToString();
                    }
                    catch
                    {
                        return cell.NumericCellValue.ToString();
                    }
            }
        }

    }

  

posted @ 2016-05-27 15:05  成败在我手  阅读(6870)  评论(1编辑  收藏  举报