数据的导入

数据的导入

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:Visual Studio 2015、导入

作者:梁柏源

撰写时间:2019/5/4

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

上次分享了NPOI导出,这次不意外分享导入,其实导出导入和其名字一样刚好相反,只是导入比导出多了个保存新增,好了废话不多,进入正题:

导入的一般步骤:

  1. 下载导入的信息模板(当然也有手动导入,不过目前讲的是批量导入);
  2. 判断模板的类型(本人这里是判断模板类型是不是: .xls);
  3. 获取读取文件并且把文件转化为二进制数组;
  4. 利用NPOI把内存流中的数据读取成工作簿Excel,并导入:
  1. 工作簿中含有工作表.;
  2. 工作表中有数据;
  3. 数据的准确性(表头和已有数据(也就是数据库)的关系相同);
  4. 然后读取数据,不重复就新增,重复就不新增。
  1. 各种提示;
  2. 保存新增的导入数据到数据库。

首先得下载模板:

public ActionResult Down (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("模板文件不存在,请联系系统运维人员。");

            }//提示,检查有没有模板文件

 

        }

然后就是判断模板的类型,获取读取文件并且把文件转化为二进制数组,利用NPOI把内存流中的数据读取成工作簿Excel,并导入:

public ActionResult ImportExcel(HttpPostedFileBase file)

        {           

ReturnJson returnJson = new ReturnJson();

            try

            {

                Session.Remove("ImportExcel");//把session中的ImportExcel移除避免残留以前数据

                //获取文件的后缀:1.判断类型是不是:    .xls

                string fileExtension = Path.GetExtension(file.FileName);

                if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))

                {

                    byte[] fileBytes = new byte[file.ContentLength]; //声明二进制数组存放文件

                    file.InputStream.Read(fileBytes, 0, file.ContentLength); //将传入的文件转化为二进制的数组存入fileBytes

                    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_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 dtExcel = new DataTable();// 定义datatable

                            NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);// 索引为1

                            int cellCount = rowHeader.LastCellNum; //获取表格列数                        

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

                            for (int i = rowHeader.FirstCellNum; i < cellCount; i++) //创建dataTable中的列,循环添加标题行中各个单元格的值

                            {

                                DataColumn dtColumn =

new DataColumn(rowHeader.GetCell(i).StringCellValue); //通过遍历行中的每一个单元格,获取标题行各个单元格的数据

                                dtExcel.Columns.Add(dtColumn); //将获取到的标题行的数据放到datatable中;

                            }                           

                            for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)

                            {

                                NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1                               

                                DataRow dtRow = dtExcel.NewRow();

                                if (row != null)

                                {

                                 for (int j = row.FirstCellNum; j < cellCount; j++)

                                    {

                                        if (row.GetCell(j) != null)

                                        {

                                            dtRow[j] = row.GetCell(j).ToString();

                                        }

                                    }

                                }

                            dtExcel.Rows.Add(dtRow); //将填入数据的dtRow添入dtExcel

                            }

……

        }

这部分查询省略,就是通过什么鬼中的AcademeName到dbAcademe中查找相应的AcademeID 然后获取班级ID和名称再根据学院ID和班级名称获取班级ID然后将每一条数据都添加到对象列表中然后记录成功的条数和记录失败的条数下面都是加载层、提示、保存到数据库什么的,就不讲了;

来看图走流程:

再来:

按步骤点击,最后保存成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值