从excel表格导入数据

博客介绍了将Excel文件数据导入数据库的思路,包括下载导入文件模板、判断文件类型为.xls,将文件转换为二进制数组、内存流,再用NPOI读取成工作簿,还需检查工作表和数据准确性。同时给出了下载模块显示到视图及导入Excel的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:
(1)下载需要导入文件的模板
(2)判断导入文件类型是不是后缀: .xls
1、获取读取的文件; 2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成工作簿Excel
(3)工作簿中有工作表
(4)工作表有数据
(5)数据准确性(学院 专业 年级 班级 表跟表之间的关系)
(6)数据都有,然后读取数据。

(1)下载需要导入文件的模板
要想将excel文件的数据导入数据库
首先要将文件的数据显示到视图中再新增到数据库中
下面就是下载模块显示到视图的代码
public ActionResult DownImportTemplate(HttpPostedFileBase file)
{
string filePath = Server.MapPath("~/Document/Template/考生信息导入模板.xls");
if (System.IO.File.Exists(filePath))
{
//获取文件的名称
string strfileName = Path.GetFileName(filePath);
return File(new FileStream(filePath, FileMode.Open), “application/octet-stream”, strfileName);
}
else
{
return Content(“模板文件不存在,请联系系统运维人员。”);
}
}
public ActionResult ImportExcel(HttpPostedFileBase file)
{
ReturnJson returnJson = new ReturnJson();
try
{
//把session中的ImportExcel移除避免残留以前数据
Session.Remove(“ImportExcel”);
//获取文件的后缀
//(1)判断类型是不是: .xls
string fileExtension = Path.GetExtension(file.FileName);
(2)判断导入文件类型是不是后缀: .xls
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);                        

                    //判断工作表中是否有数据
                    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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值