ASP.NET MVC中如何实现Excel数据的导出导入

第一步,利用Nuget获取NPOI插件;

ASP.NET MVC中如何实现Excel数据的导出导入_第1张图片

第二步,

引用添加完成后,主要会添加四个dll的引用;四个dll:NPOI、NPOI.OOXML、NPOI.OpenXML4Net、 NPOI.OpenXmlFormats;

ASP.NET MVC中如何实现Excel数据的导出导入_第2张图片

 ASP.NET MVC中如何实现Excel数据的导出导入_第3张图片

ASP.NET MVC中如何实现Excel数据的导出导入_第4张图片

第三步: 前端(导入数据)

表单(演示是HTML辅助器形式的表单,也可使用HTML5经典表单
):
 

@using (Html.BeginForm("Import", "manage", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
          
           

}

第四步:控制器(导入数据)

先导入这两个命名空间(如图)

ASP.NET MVC中如何实现Excel数据的导出导入_第5张图片

 第一个方法根据数据库表字段而定(注意...Add()的内容),后面两个方法直接复制使用

        /// 
        /// 导入数据1
        /// 
        /// 
        /// 
        [HttpPost]
        public ActionResult Import(HttpPostedFileBase file)
        {
            var fileName = file.FileName;
            var filePath = Server.MapPath(string.Format("~/{0}", "Files"));
            string path = Path.Combine(filePath, fileName);
            file.SaveAs(path);

            DataTable excelTable = new DataTable();
            excelTable = ImportExcel.GetExcelDataTable(path);

            DataTable dbdata = new DataTable();
            dbdata.Columns.Add("ID");//“ID”就是对应你数据库的字段
            dbdata.Columns.Add("StuName");
            //(...根据你的数据库字段写来定...)

            for (int i = 0; i < excelTable.Rows.Count; i++)
            {
                DataRow dr = excelTable.Rows[i];
                DataRow dr_ = dbdata.NewRow();
                dr_["ID"] = dr["学生编号"];
                dr_["StuName"] = dr["学生姓名"];
                //(...根据你的数据库字段来定...)

                dbdata.Rows.Add(dr_);//添加保存
            }
            RemoveEmpty(dbdata);

            string constr = System.Configuration.ConfigurationManager.AppSettings["LoveManagementDB_"];

            SqlBulkCopyByDatatable(constr, "Student", dbdata);

            return RedirectToAction("classManage");
        }


        /// 
        /// 数据插入2
        /// 
        /// 目标库连接
        /// 目标表
        /// 来源数据
        public static void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dtSelect)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
                {
                    try
                    {
                        sqlbulkcopy.DestinationTableName = TableName;
                        sqlbulkcopy.BatchSize = 20000;
                        sqlbulkcopy.BulkCopyTimeout = 0;//不限时间
                        for (int i = 0; i < dtSelect.Columns.Count; i++)
                        {
                            sqlbulkcopy.ColumnMappings.Add(dtSelect.Columns[i].ColumnName, dtSelect.Columns[i].ColumnName);
                        }
                        sqlbulkcopy.WriteToServer(dtSelect);
                    }
                    catch (System.Exception ex)
                    {
                        throw ex;
                    }
                }
            }
        }

        /// 
        /// 批量导入步骤3
        /// 
        /// 
        protected void RemoveEmpty(DataTable dt)
        {
            List removelist = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                bool IsNull = true;
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
                    {
                        IsNull = false;
                    }
                }
                if (IsNull)
                {
                    removelist.Add(dt.Rows[i]);
                }
            }
            for (int i = 0; i < removelist.Count; i++)
            {
                dt.Rows.Remove(removelist[i]);
            }
        }



最后:实现导出数据

前端:   使用a标签提交

导出数据

控制器:(根据数据库表字段去对应修改,看对应注释)

    /// 
    /// 导出(根据班级ID导出对应数据)
    /// 
    /// 根据班级ID
    /// 
    public ActionResult getExcelByStudent(int tbClassId)
        {
            List listStudent = db.Student.Where(n => n.TbClassID == tbClassId).ToList(); //在这里写查询代码...);
            TbClass tbclass = db.TbClass.Where(n => n.ClassID == tbClassId).FirstOrDefault();
            //将查询出来的数据转化为对象列表的格式
            HSSFWorkbook excelBook = new HSSFWorkbook(); //创建工作簿Excel

            NPOI.SS.UserModel.ISheet sheet1 = excelBook.CreateSheet(tbclass.TbClassName + "详情信息");//为工作簿创建工作表并命名

            //编写工作表 (1)表头 (2)数据:listStudent

            NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);//创建第一行

            row1.CreateCell(0).SetCellValue("学生编号"); //创建其他列并赋值( 根据具体数据写代码...)
            row1.CreateCell(1).SetCellValue("学生姓名");   
            //...根据数据库表字段而定...
            

            for (int i = 0; i < listStudent.Count(); i++)

            {

                //创建行( 根据具体数据写代码...)

                NPOI.SS.UserModel.IRow rowTemp = sheet1.CreateRow(i + 1);

                rowTemp.CreateCell(0).SetCellValue(listStudent[i].ID);//对应表字段
                rowTemp.CreateCell(1).SetCellValue(listStudent[i].StuName);
                //...根据数据库表字段而定...
                
            }

            var fileName = tbclass.TbClassName + "的学生信息" + ".xls";//文件名

            //将Excel表格转化为流,输出

            MemoryStream bookStream = new MemoryStream();//创建文件流

            excelBook.Write(bookStream); //文件写入流(向流中写入字节序列)

            bookStream.Seek(0, SeekOrigin.Begin);//输出之前调用Seek,把0位置指定为开始位置

            return File(bookStream, "application/vnd.ms-excel", fileName);//最后以文件形式返回

        }

你可能感兴趣的:(ASP.NET,MVC,mvc)