Excel表格数据导入

11 篇文章 0 订阅
2 篇文章 0 订阅

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

    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++)
                    {
                        //获取行(1、2、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);
}

内容有点多,需要点耐心看完。

现在HSSFWorkbook貌似已经不兼容XLSX格式的文件,把HSSFWorkbook改成XSSFWorkbook便可正常使用
注:文中的returnJson只是我定义的一个普通的返回类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值