Excel表格数据导入

要先引用NPOI的插件即可写导入方法。
思路:
(1)判断类型是否是: .xls
一、获取读取的文件; 二、把文件转换为二进制数组;三、二进制数组转成内存流;四、利用NPOI把内存流中的数据读取成工做簿Excel
(2)工做簿中有工做表
(3)工做表有数据
(4)数据准确性
(5)数据都有,而后读取数据。
如下是供参考的方法:
代码实在是有点长,不过代码中的注释写的很是清楚了。web

public ActionResult ImportExcel(HttpPostedFileBase file)
{

    ReturnJson returnJson = new ReturnJson();
    try
    {
        //把session中的ImportExcel移除避免残留之前数据
        Session.Remove("ImportExcel");
        //获取文件的后缀
        //(1)判断类型是否是:    .xls
        string fileExtension = Path.GetExtension(file.FileName);
        if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
        {
            //声明二进制数组存放文件
            byte[] fileBytes = new byte[file.ContentLength];
            //将传入的文件转化为二进制的数组存入fileBytes
            file.InputStream.Read(fileBytes, 0, file.ContentLength);
            //将二进制数组转化为内存流
            MemoryStream excelFileStream = new MemoryStream(fileBytes);
            //将内存流转化为工做簿
            NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);

            //(2)工做簿中有工做表
            if (workbook.NumberOfSheets > 0)
            {
                //查询出 学院,专业,年级,班级 的信息:用来根据名称获取对应的ID
                List<SYS_Academe> dbAcademe = (from tbAcademe in myModels.SYS_Academe
                                               select tbAcademe).ToList();
                List<SYS_Specialty> dbSpecialty = (from tbSpecialty in myModels.SYS_Specialty
                                                   select tbSpecialty).ToList();
                List<SYS_Grade> dbGrade = (from tbGrade in myModels.SYS_Grade
                                           select tbGrade).ToList();
                List<SYS_Class> dbClass = (from tbClass in myModels.SYS_Class
                                           select tbClass).ToList();

                //对象列表
                List<Student> listStudentVo = new List<Student>();
                //获取第一个工做表
                NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
                //(3)工做表有数据                        

                //判断工做表中是否有数据
                if (sheet.PhysicalNumberOfRows > 0)
                {
                    //(4)数据准确性(学院	专业 年级	班级   表跟表之间的关系)
                    // 定义datatable
                    DataTable dtExcel = new DataTable();
                    //将数据先装到datatable中                        
                    //获取标题行--- 第二行,索引为1;第一行是说明
                    NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);

                    //获取表格列数  
                    int cellCount = rowHeader.LastCellNum;
                    //获取表格行数
                    int rowCount = sheet.LastRowNum + 1;

                    //建立dataTable中的列,循环添加标题行中各个单元格的值
                    for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
                    {
                        //经过遍历行中的每个单元格,获取标题行各个单元格的数据
                        DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
                        //将获取到的标题行的数据放到datatable中;
                        dtExcel.Columns.Add(dtColumn);
                    }
                    //读取Excel中的数据
                    //(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
                    for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)
                    {
                        //获取行(一、二、3...)数据
                        NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1
                        //建立DataTable行
                        DataRow dtRow = dtExcel.NewRow();
                        if (row != null)
                        {
                            //遍历excel中一行的全部单元格
                            for (int j = row.FirstCellNum; j < cellCount; j++)
                            {
                                if (row.GetCell(j) != null)
                                {
                                    dtRow[j] = row.GetCell(j).ToString();
                                }
                            }
                        }
                        //将填入数据的dtRow添入dtExcel
                        dtExcel.Rows.Add(dtRow);
                    }
                    int intSuccess = 0;
                    int intFail = 0;

                    //(4)数据准确性(学院	专业	年级	班级   表跟表之间的关系)
                    //遍历datatable中的数据
                    foreach (DataRow row in dtExcel.Rows)
                    {
                        //建立studentVo对象保存每一条数据
                        Student student = new Student();
                        try
                        {
                            //获取学院ID 和学院名称
                            student.AcademeName = row["学院"].ToString().Trim();
                            //经过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID
                            student.AcademeID = dbAcademe.Where(p => p.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;

                            //获取专业id和名称
                            //根据学院ID和专业名称获取相应的专业ID
                            student.SpecialtyName = row["专业"].ToString().Trim();
                            student.SpecialtyID = dbSpecialty.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyName == student.SpecialtyName).SingleOrDefault().SpecialtyID;

                            //获取年级ID 和名称
                            //根据学院ID以及年级名称获取相应的年级ID
                            student.GradeName = row["年级"].ToString().Trim();
                            student.GradeID = dbGrade.Where(p => p.AcademeID == student.AcademeID && p.GradeName == student.GradeName).SingleOrDefault().GradeID;
                            //获取 班级ID和名称
                            //根据学院ID&专业ID&班级名称获取班级ID
                            student.ClassName = row["班级"].ToString().Trim();
                            student.ClassID = dbClass.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyID == student.SpecialtyID && p.GradeID == student.GradeID && p.ClassName == student.ClassName).SingleOrDefault().ClassID;

                            student.StudentNumber = row["学号"].ToString().Trim();
                            student.StudentName = row["姓名"].ToString().Trim();
                            student.StudentIDNum = row["身份证号"].ToString().Trim();
                            student.StudentSex = row["性别"].ToString().Trim();
                            student.UserNuber = row["帐号"].ToString().Trim();

                            //将每一条数据都添加到对象列表中
                            listStudentVo.Add(student);
                            intSuccess++;//记录成功的条数
                        }
                        catch (Exception e)
                        {

                            Console.WriteLine(e);
                            intFail++;//记录失败的条数
                            returnJson.State = false;
                            returnJson.Text = "数据处理出错";
                        }

                    }
                    //把数据保存到Session当中
                    Session["ImportExcel"] = listStudentVo;
                    returnJson.State = true;
                    //{0},{1}和{2}是占位符,分别给dtExcel.Rows.Count,intSuccess和intFail占位的。
                    returnJson.Text = String.Format("success;excel文件中共{0}条信息,{1}条匹配成功,{2}条匹配失败", dtExcel.Rows.Count, intSuccess, intFail);

                }
                else
                {
                    returnJson.State = false;
                    returnJson.Text = "工做表数据为空";
                }

            }
            else
            {
                returnJson.State = false;
                returnJson.Text = "工做簿中没有工做表!";
            }
        }
        else
        {
            returnJson.State = false;
            returnJson.Text = "选中的文件类型不正确!";
        }

    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        returnJson.State = false;
        returnJson.Text = "上传失败,类型不对应;请检查是否有工做表,是否有数据,是否按照模板填写!";

    }
    return Json(returnJson, JsonRequestBehavior.AllowGet);
}

内容有点多,须要点耐心看完。数组